diff --git a/aws/s3/core/src/main/java/org/jclouds/aws/s3/S3BlobStore.java b/aws/s3/core/src/main/java/org/jclouds/aws/s3/S3BlobStore.java index b3bb6965c2..459608d63d 100644 --- a/aws/s3/core/src/main/java/org/jclouds/aws/s3/S3BlobStore.java +++ b/aws/s3/core/src/main/java/org/jclouds/aws/s3/S3BlobStore.java @@ -49,7 +49,7 @@ import org.jclouds.aws.s3.xml.ListAllMyBucketsHandler; import org.jclouds.aws.s3.xml.ListBucketHandler; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.domain.Blob; -import org.jclouds.blobstore.functions.BlobKey; +import org.jclouds.blobstore.functions.BlobName; import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404; import org.jclouds.http.functions.ParseETagHeader; @@ -181,7 +181,7 @@ public interface S3BlobStore extends BlobStore putBlob( @HostPrefixParam String bucketName, - @PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindS3ObjectToEntity.class) S3Object object); + @PathParam("key") @ParamParser(BlobName.class) @BinderParam(BindS3ObjectToEntity.class) S3Object object); @PUT @Path("/") diff --git a/aws/s3/core/src/main/java/org/jclouds/aws/s3/S3Connection.java b/aws/s3/core/src/main/java/org/jclouds/aws/s3/S3Connection.java index af39035a3b..e203be9c62 100644 --- a/aws/s3/core/src/main/java/org/jclouds/aws/s3/S3Connection.java +++ b/aws/s3/core/src/main/java/org/jclouds/aws/s3/S3Connection.java @@ -55,7 +55,7 @@ import org.jclouds.aws.s3.xml.CopyObjectHandler; import org.jclouds.aws.s3.xml.ListAllMyBucketsHandler; import org.jclouds.aws.s3.xml.ListBucketHandler; import org.jclouds.blobstore.domain.Blob; -import org.jclouds.blobstore.functions.BlobKey; +import org.jclouds.blobstore.functions.BlobName; import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.blobstore.functions.ThrowContainerNotFoundOn404; import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404; @@ -206,7 +206,7 @@ public interface S3Connection { @ResponseParser(ParseETagHeader.class) Future putObject( @HostPrefixParam String bucketName, - @PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindS3ObjectToEntity.class) S3Object object, + @PathParam("key") @ParamParser(BlobName.class) @BinderParam(BindS3ObjectToEntity.class) S3Object object, PutObjectOptions... options); /** diff --git a/aws/s3/core/src/main/java/org/jclouds/aws/s3/binders/BindS3ObjectToEntity.java b/aws/s3/core/src/main/java/org/jclouds/aws/s3/binders/BindS3ObjectToEntity.java index 8516ab0a9e..8d2a3f7ab7 100755 --- a/aws/s3/core/src/main/java/org/jclouds/aws/s3/binders/BindS3ObjectToEntity.java +++ b/aws/s3/core/src/main/java/org/jclouds/aws/s3/binders/BindS3ObjectToEntity.java @@ -31,11 +31,11 @@ import javax.inject.Named; import javax.ws.rs.core.HttpHeaders; import org.jclouds.aws.s3.domain.S3Object; -import org.jclouds.blobstore.binders.BindBlobToEntity; +import org.jclouds.blobstore.binders.BindBlobToEntityAndUserMetadataToHeadersWithPrefix; import org.jclouds.blobstore.domain.Blob; import org.jclouds.http.HttpRequest; -public class BindS3ObjectToEntity extends BindBlobToEntity { +public class BindS3ObjectToEntity extends BindBlobToEntityAndUserMetadataToHeadersWithPrefix { @Inject public BindS3ObjectToEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) { super(metadataPrefix); diff --git a/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/BucketMetadata.java b/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/BucketMetadata.java index 2f6b26ef05..5839e1313b 100644 --- a/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/BucketMetadata.java +++ b/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/BucketMetadata.java @@ -23,7 +23,7 @@ */ package org.jclouds.aws.s3.domain; -import org.jclouds.blobstore.domain.ContainerMetadata; +import org.jclouds.blobstore.internal.ContainerMetadataImpl; import org.joda.time.DateTime; /** @@ -31,7 +31,7 @@ import org.joda.time.DateTime; * * @author Adrian Cole */ -public class BucketMetadata extends ContainerMetadata { +public class BucketMetadata extends ContainerMetadataImpl { protected DateTime creationDate; public DateTime getCreationDate() { diff --git a/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/ObjectMetadata.java b/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/ObjectMetadata.java index 7a93ea29aa..91c7e69a83 100644 --- a/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/ObjectMetadata.java +++ b/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/ObjectMetadata.java @@ -25,7 +25,7 @@ package org.jclouds.aws.s3.domain; import java.io.Serializable; -import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.blobstore.internal.BlobMetadataImpl; /** * /** Amazon S3 is designed to store objects. Objects are stored in {@link S3BucketListing buckets} @@ -38,7 +38,7 @@ import org.jclouds.blobstore.domain.BlobMetadata; * * @see */ -public class ObjectMetadata extends BlobMetadata implements Serializable { +public class ObjectMetadata extends BlobMetadataImpl implements Serializable { /** The serialVersionUID */ private static final long serialVersionUID = -4415449798024051115L; @@ -51,7 +51,7 @@ public class ObjectMetadata extends BlobMetadata implements Serializable { dataDisposition).append(", owner=").append(owner).append(", storageClass=").append( storageClass).append(", allHeaders=").append(allHeaders).append(", dataEncoding=") .append(dataEncoding).append(", dataType=").append(dataType).append(", eTag=") - .append(eTag).append(", key=").append(key).append(", lastModified=").append( + .append(eTag).append(", key=").append(name).append(", lastModified=").append( lastModified).append(", size=").append(size).append(", userMetadata=") .append(userMetadata).append("]"); return builder.toString(); @@ -186,7 +186,7 @@ public class ObjectMetadata extends BlobMetadata implements Serializable { } public int compareTo(ObjectMetadata o) { - return (this == o) ? 0 : getKey().compareTo(o.getKey()); + return (this == o) ? 0 : getName().compareTo(o.getName()); } public void setContentEncoding(String dataEncoding) { diff --git a/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/S3Object.java b/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/S3Object.java index b2181059f2..09458884e8 100644 --- a/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/S3Object.java +++ b/aws/s3/core/src/main/java/org/jclouds/aws/s3/domain/S3Object.java @@ -25,7 +25,7 @@ package org.jclouds.aws.s3.domain; import javax.inject.Inject; -import org.jclouds.blobstore.domain.Blob; +import org.jclouds.blobstore.internal.BlobImpl; /** * Amazon S3 is designed to store objects. Objects are stored in {@link S3Bucket buckets} and @@ -37,7 +37,7 @@ import org.jclouds.blobstore.domain.Blob; * @see */ -public class S3Object extends Blob { +public class S3Object extends BlobImpl { public S3Object(ObjectMetadata metadata, Object data) { super(metadata, data); diff --git a/aws/s3/core/src/test/java/org/jclouds/aws/s3/internal/StubS3Connection.java b/aws/s3/core/src/test/java/org/jclouds/aws/s3/internal/StubS3Connection.java index ca8383e8fc..0e4d4608e6 100755 --- a/aws/s3/core/src/test/java/org/jclouds/aws/s3/internal/StubS3Connection.java +++ b/aws/s3/core/src/test/java/org/jclouds/aws/s3/internal/StubS3Connection.java @@ -121,7 +121,7 @@ public class StubS3Connection extends StubBlobStore() { public boolean apply(ObjectMetadata metadata) { - return metadata.getKey().equals(finalMarker); + return metadata.getName().equals(finalMarker); } }); contents = contents.tailSet(lastMarkerMetadata); @@ -133,7 +133,7 @@ public class StubS3Connection extends StubBlobStore() { public boolean apply(ObjectMetadata o) { - return (o != null && o.getKey().startsWith(prefix)); + return (o != null && o.getName().startsWith(prefix)); } })); } @@ -161,7 +161,7 @@ public class StubS3Connection extends StubBlobStore putBlob(@PathParam("container") String container, - @PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindBlobToEntity.class) Blob object); + @PathParam("key") @ParamParser(BlobName.class) @BinderParam(BindBlobToEntityAndUserMetadataToHeadersWithPrefix.class) Blob object); /** * The Get Blob operation reads or downloads a blob from the system, including its metadata and diff --git a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/AzureBlobStore.java b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/AzureBlobStore.java index d7dc537726..9f257073d8 100644 --- a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/AzureBlobStore.java +++ b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/AzureBlobStore.java @@ -50,7 +50,7 @@ import org.jclouds.azure.storage.filters.SharedKeyAuthentication; import org.jclouds.azure.storage.options.ListOptions; import org.jclouds.azure.storage.reference.AzureStorageHeaders; import org.jclouds.blobstore.BlobStore; -import org.jclouds.blobstore.functions.BlobKey; +import org.jclouds.blobstore.functions.BlobName; import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404; import org.jclouds.http.functions.ParseETagHeader; @@ -149,7 +149,7 @@ public interface AzureBlobStore extends BlobStore putBlob( @PathParam("container") String container, - @PathParam("key") @ParamParser(BlobKey.class) @BinderParam(GenerateMD5AndBindBlobToEntity.class) Blob object); + @PathParam("key") @ParamParser(BlobName.class) @BinderParam(GenerateMD5AndBindBlobToEntity.class) Blob object); @GET @ResponseParser(ParseBlobFromHeadersAndHttpContent.class) diff --git a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/binders/BindBlobToEntity.java b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/binders/BindBlobToEntity.java index 61631e5fd8..0280332524 100644 --- a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/binders/BindBlobToEntity.java +++ b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/binders/BindBlobToEntity.java @@ -34,7 +34,7 @@ import org.jclouds.azure.storage.blob.domain.BlobMetadata; import org.jclouds.blobstore.domain.Blob; import org.jclouds.http.HttpRequest; -public class BindBlobToEntity extends org.jclouds.blobstore.binders.BindBlobToEntity { +public class BindBlobToEntity extends org.jclouds.blobstore.binders.BindBlobToEntityAndUserMetadataToHeadersWithPrefix { @Inject public BindBlobToEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) { super(metadataPrefix); diff --git a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/binders/GenerateMD5AndBindBlobToEntity.java b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/binders/GenerateMD5AndBindBlobToEntity.java index e265054106..bebb275a03 100644 --- a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/binders/GenerateMD5AndBindBlobToEntity.java +++ b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/binders/GenerateMD5AndBindBlobToEntity.java @@ -47,7 +47,7 @@ public class GenerateMD5AndBindBlobToEntity extends BindBlobToEntity { try { object.generateMD5(); } catch (IOException e) { - throw new RuntimeException("Could not generate MD5 for " + object.getKey(), e); + throw new RuntimeException("Could not generate MD5 for " + object.getName(), e); } } super.bindToRequest(request, entity); diff --git a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/Blob.java b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/Blob.java index 840b7513ce..a8541a34cc 100644 --- a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/Blob.java +++ b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/Blob.java @@ -23,10 +23,12 @@ */ package org.jclouds.azure.storage.blob.domain; +import org.jclouds.blobstore.internal.BlobImpl; + /** * @author Adrian Cole */ -public class Blob extends org.jclouds.blobstore.domain.Blob { +public class Blob extends BlobImpl { public Blob(BlobMetadata metadata, BlobMetadata data) { super(metadata, data); diff --git a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/BlobMetadata.java b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/BlobMetadata.java index 25c8d2528d..283025d981 100644 --- a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/BlobMetadata.java +++ b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/BlobMetadata.java @@ -27,6 +27,7 @@ import java.net.URI; import javax.inject.Inject; +import org.jclouds.blobstore.internal.BlobMetadataImpl; import org.joda.time.DateTime; import com.google.inject.internal.Nullable; @@ -36,7 +37,7 @@ import com.google.inject.internal.Nullable; * @author Adrian Cole * */ -public class BlobMetadata extends org.jclouds.blobstore.domain.BlobMetadata { +public class BlobMetadata extends BlobMetadataImpl { /** The serialVersionUID */ private static final long serialVersionUID = 1L; private URI url; diff --git a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/ContainerMetadata.java b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/ContainerMetadata.java index 56cc8f65fc..e2e17a1693 100755 --- a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/ContainerMetadata.java +++ b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/domain/ContainerMetadata.java @@ -36,7 +36,7 @@ import com.google.common.collect.Multimap; * @author Adrian Cole * */ -public class ContainerMetadata extends org.jclouds.blobstore.domain.ContainerMetadata { +public class ContainerMetadata extends org.jclouds.blobstore.internal.ContainerMetadataImpl { private URI url; private DateTime lastModified; private byte[] eTag; diff --git a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/xml/AddMD5ToListBlobsResponse.java b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/xml/AddMD5ToListBlobsResponse.java index 3f8c023e68..7e39773ee8 100644 --- a/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/xml/AddMD5ToListBlobsResponse.java +++ b/azure/storage/blob/core/src/main/java/org/jclouds/azure/storage/blob/xml/AddMD5ToListBlobsResponse.java @@ -53,8 +53,8 @@ public class AddMD5ToListBlobsResponse extends ContainerNameEnumerationResultsHa ListBlobsResponse response = super.getResult(); checkNotNull(response.getContainerUrl(), "containerUrl"); for (BlobMetadata md : response) { - checkNotNull(md.getKey(), "key"); - md.setContentMD5(util.getMD5(response.getContainerUrl(), md.getKey())); + checkNotNull(md.getName(), "key"); + md.setContentMD5(util.getMD5(response.getContainerUrl(), md.getName())); } return response; } diff --git a/azure/storage/blob/core/src/test/java/org/jclouds/azure/storage/blob/AzureBlobConnectionLiveTest.java b/azure/storage/blob/core/src/test/java/org/jclouds/azure/storage/blob/AzureBlobConnectionLiveTest.java index 792ed18c45..c28fad9180 100644 --- a/azure/storage/blob/core/src/test/java/org/jclouds/azure/storage/blob/AzureBlobConnectionLiveTest.java +++ b/azure/storage/blob/core/src/test/java/org/jclouds/azure/storage/blob/AzureBlobConnectionLiveTest.java @@ -251,8 +251,8 @@ public class AzureBlobConnectionLiveTest { } // Test HEAD of object - BlobMetadata metadata = connection.getBlobProperties(privateContainer, object.getKey()); - // TODO assertEquals(metadata.getKey(), object.getKey()); + BlobMetadata metadata = connection.getBlobProperties(privateContainer, object.getName()); + // TODO assertEquals(metadata.getName(), object.getName()); // we can't check this while hacking around lack of content-md5, as GET of the first byte will // show incorrect length 1, the returned size, as opposed to the real length. This is an ok // tradeoff, as a container list will contain the correct size of the objects in an @@ -271,7 +271,7 @@ public class AzureBlobConnectionLiveTest { // Multimap userMetadata = HashMultimap.create(); // userMetadata.put("New-Metadata-1", "value-1"); // userMetadata.put("New-Metadata-2", "value-2"); - // assertTrue(connection.setObjectMetadata(privateContainer, object.getKey(), userMetadata)); + // assertTrue(connection.setObjectMetadata(privateContainer, object.getName(), userMetadata)); // Test GET of missing object try { @@ -281,10 +281,10 @@ public class AzureBlobConnectionLiveTest { e.printStackTrace(); } // Test GET of object (including updated metadata) - Blob getBlob = connection.getBlob(privateContainer, object.getKey()).get(120, + Blob getBlob = connection.getBlob(privateContainer, object.getName()).get(120, TimeUnit.SECONDS); assertEquals(IOUtils.toString((InputStream) getBlob.getData()), data); - // TODO assertEquals(getBlob.getKey(), object.getKey()); + // TODO assertEquals(getBlob.getName(), object.getName()); assertEquals(getBlob.getContentLength(), data.length()); assertEquals(getBlob.getMetadata().getContentType(), "text/plain"); assertEquals(HttpUtils.toHexString(md5), HttpUtils.toHexString(getBlob.getMetadata() @@ -323,7 +323,7 @@ public class AzureBlobConnectionLiveTest { // Test GET with options // Non-matching ETag try { - connection.getBlob(privateContainer, object.getKey(), + connection.getBlob(privateContainer, object.getName(), GetOptions.Builder.ifETagDoesntMatch(newEtag)).get(120, TimeUnit.SECONDS); } catch (Exception e) { assertEquals(e.getCause().getClass(), HttpResponseException.class); @@ -331,7 +331,7 @@ public class AzureBlobConnectionLiveTest { } // Matching ETag - getBlob = connection.getBlob(privateContainer, object.getKey(), + getBlob = connection.getBlob(privateContainer, object.getName(), GetOptions.Builder.ifETagMatches(newEtag)).get(120, TimeUnit.SECONDS); assertEquals(getBlob.getMetadata().getETag(), newEtag); @@ -339,7 +339,7 @@ public class AzureBlobConnectionLiveTest { // doesn't work per // http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/479fa63f-51df-4b66-96b5-33ae362747b6 // getBlob = connection - // .getBlob(privateContainer, object.getKey(), GetOptions.Builder.startAt(8)).get(120, + // .getBlob(privateContainer, object.getName(), GetOptions.Builder.startAt(8)).get(120, // TimeUnit.SECONDS); // assertEquals(IOUtils.toString((InputStream) getBlob.getData()), data.substring(8)); diff --git a/azure/storage/blob/core/src/test/java/org/jclouds/azure/storage/blob/xml/AddMD5ToListBlobsResponseTest.java b/azure/storage/blob/core/src/test/java/org/jclouds/azure/storage/blob/xml/AddMD5ToListBlobsResponseTest.java index 5d7350dbda..f21e7c28d5 100644 --- a/azure/storage/blob/core/src/test/java/org/jclouds/azure/storage/blob/xml/AddMD5ToListBlobsResponseTest.java +++ b/azure/storage/blob/core/src/test/java/org/jclouds/azure/storage/blob/xml/AddMD5ToListBlobsResponseTest.java @@ -122,7 +122,7 @@ public class AddMD5ToListBlobsResponseTest extends BaseHandlerTest { ), null, null, 4, "newblob2.txt", null, "myfolder/"); BoundedSortedSet result = (BoundedSortedSet) factory - .create(injector.getInstance(ContainerNameEnumerationResultsHandler.class)) + .create(injector.getInstance(AddMD5ToListBlobsResponse.class)) .parse(is); assertEquals(result, list); diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/BlobStoreContextImpl.java b/blobstore/core/src/main/java/org/jclouds/blobstore/BlobStoreContextImpl.java index 1b5f49f410..08554b1389 100644 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/BlobStoreContextImpl.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/BlobStoreContextImpl.java @@ -66,7 +66,7 @@ public class BlobStoreContextImpl object = (Blob) entity; - for (String key : object.getMetadata().getUserMetadata().keySet()) { - request.getHeaders().put(key.startsWith(metadataPrefix) ? key : metadataPrefix + key, - object.getMetadata().getUserMetadata().get(key)); - } request.setEntity(checkNotNull(object.getData(), "object.getContent()")); request.getHeaders() .put( diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/binders/BindBlobToEntityAndUserMetadataToHeadersWithPrefix.java b/blobstore/core/src/main/java/org/jclouds/blobstore/binders/BindBlobToEntityAndUserMetadataToHeadersWithPrefix.java new file mode 100644 index 0000000000..4a21703d82 --- /dev/null +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/binders/BindBlobToEntityAndUserMetadataToHeadersWithPrefix.java @@ -0,0 +1,52 @@ +/** + * + * Copyright (C) 2009 Global Cloud Specialists, Inc. + * + * ==================================================================== + * 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.blobstore.binders; + +import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_METADATA_PREFIX; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.jclouds.blobstore.domain.Blob; +import org.jclouds.http.HttpRequest; + +public class BindBlobToEntityAndUserMetadataToHeadersWithPrefix extends BindBlobToEntity { + private final String metadataPrefix; + + @Inject + public BindBlobToEntityAndUserMetadataToHeadersWithPrefix( + @Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) { + this.metadataPrefix = metadataPrefix; + } + + public void bindToRequest(HttpRequest request, Object entity) { + Blob object = (Blob) entity; + + for (String key : object.getMetadata().getUserMetadata().keySet()) { + request.getHeaders().put(key.startsWith(metadataPrefix) ? key : metadataPrefix + key, + object.getMetadata().getUserMetadata().get(key)); + } + super.bindToRequest(request, entity); + } +} diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/binders/BindBlobToMultipartForm.java b/blobstore/core/src/main/java/org/jclouds/blobstore/binders/BindBlobToMultipartForm.java index 39ae903ee3..1f99ee5dee 100644 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/binders/BindBlobToMultipartForm.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/binders/BindBlobToMultipartForm.java @@ -52,7 +52,7 @@ public class BindBlobToMultipartForm implements Binder { public void bindToRequest(HttpRequest request, Object entity) { Blob object = (Blob) entity; - Key key = BlobStoreUtils.parseKey(new Key("junk", object.getKey())); + Key key = BlobStoreUtils.parseKey(new Key("junk", object.getName())); Multimap partHeaders = ImmutableMultimap.of("Content-Disposition", String .format("form-data; name=\"%s\"; filename=\"%s\"", key.getKey(), key.getKey()), HttpHeaders.CONTENT_TYPE, checkNotNull(object.getMetadata().getContentType(), diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/domain/Blob.java b/blobstore/core/src/main/java/org/jclouds/blobstore/domain/Blob.java index e5ffc1c19d..c4396c08fc 100644 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/domain/Blob.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/domain/Blob.java @@ -23,17 +23,12 @@ */ package org.jclouds.blobstore.domain; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; - import java.awt.Container; import java.io.IOException; -import java.io.InputStream; -import javax.inject.Inject; +import org.jclouds.blobstore.internal.BlobImpl; -import org.jclouds.http.HttpUtils; -import org.jclouds.http.HttpUtils.MD5InputStreamResult; +import com.google.inject.ImplementedBy; /** * Value type for an HTTP Blob service. Blobs are stored in {@link Container containers} and consist @@ -43,81 +38,13 @@ import org.jclouds.http.HttpUtils.MD5InputStreamResult; * * @author Adrian Cole */ -public class Blob implements Comparable> { - - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Blob other = (Blob) obj; - if (contentLength != other.contentLength) - return false; - if (contentRange == null) { - if (other.contentRange != null) - return false; - } else if (!contentRange.equals(other.contentRange)) - return false; - if (data == null) { - if (other.data != null) - return false; - } else if (!data.equals(other.data)) - return false; - if (getMetadata() == null) { - if (other.getMetadata() != null) - return false; - } else if (!getMetadata().equals(other.getMetadata())) - return false; - return true; - } - - @Override - public String toString() { - return "Blob [contentLength=" + contentLength + ", contentRange=" + contentRange + ", data=" - + data + ", metadata=" + getMetadata() + "]"; - } - - protected Object data; - private M metadata; - protected long contentLength = -1; - protected String contentRange; - - @SuppressWarnings("unchecked") - public Blob(String key) { - // TODO: why are we getting a generic warning here? - this((M) new BlobMetadata(key)); - } - - @SuppressWarnings("unchecked") - @Inject - public Blob() { - this((M) new BlobMetadata()); - } - - public Blob(M metadata) { - this.setMetadata(metadata); - } - - public Blob(M metadata, Object data) { - this(metadata); - setData(data); - } - - public Blob(String key, Object data) { - this(key); - setData(data); - } +@ImplementedBy(BlobImpl.class) +public interface Blob { /** - * @see BlobMetadata#getKey() + * @see BlobMetadata#getName() */ - public String getKey() { - return getMetadata().getKey(); - } + String getName(); /** * Sets entity for the request or the content from the response. If size isn't set, this will @@ -127,11 +54,7 @@ public class Blob implements Comparable> { * typically InputStream for downloads, or File, byte [], String, or InputStream for * uploads. */ - public void setData(Object data) { - this.data = checkNotNull(data, "data"); - if (getMetadata().getSize() == -1) - this.getMetadata().setSize(HttpUtils.calculateSize(data)); - } + void setData(Object data); /** * generate an MD5 Hash for the current data. @@ -143,46 +66,19 @@ public class Blob implements Comparable> { * @throws IOException * if there is a problem generating the hash. */ - public void generateMD5() throws IOException { - checkState(data != null, "data"); - if (data instanceof InputStream) { - MD5InputStreamResult result = HttpUtils.generateMD5Result((InputStream) data); - getMetadata().setSize(result.length); - getMetadata().setContentMD5(result.eTag); - setData(result.data); - } else { - getMetadata().setContentMD5(HttpUtils.md5(data)); - } - } + void generateMD5() throws IOException; /** * @return InputStream, if downloading, or whatever was set during {@link #setData(Object)} */ - public Object getData() { - return data; - } + Object getData(); /** * @return System and User metadata relevant to this object. */ - public M getMetadata() { - return metadata; - } + M getMetadata(); - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (int) (contentLength ^ (contentLength >>> 32)); - result = prime * result + ((contentRange == null) ? 0 : contentRange.hashCode()); - result = prime * result + ((data == null) ? 0 : data.hashCode()); - result = prime * result + ((getMetadata() == null) ? 0 : getMetadata().hashCode()); - return result; - } - - public void setContentLength(long contentLength) { - this.contentLength = contentLength; - } + void setContentLength(long contentLength); /** * Returns the total size of the downloaded object, or the chunk that's available. @@ -194,13 +90,9 @@ public class Blob implements Comparable> { * @see org.jclouds.http.HttpHeaders#CONTENT_LENGTH * @see GetObjectOptions */ - public long getContentLength() { - return contentLength; - } + long getContentLength(); - public void setContentRange(String contentRange) { - this.contentRange = contentRange; - } + void setContentRange(String contentRange); /** * If this is not-null, {@link #getContentLength() } will the size of chunk of the Value available @@ -209,16 +101,8 @@ public class Blob implements Comparable> { * @see org.jclouds.http.HttpHeaders#CONTENT_RANGE * @see GetObjectOptions */ - public String getContentRange() { - return contentRange; - } + String getContentRange(); - public void setMetadata(M metadata) { - this.metadata = metadata; - } + void setMetadata(M metadata); - public int compareTo(Blob o) { - return (this == o) ? 0 : getKey().compareTo(o.getKey()); - } - -} +} \ No newline at end of file diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/domain/BlobMetadata.java b/blobstore/core/src/main/java/org/jclouds/blobstore/domain/BlobMetadata.java index 8aa977e33d..2e55ebc825 100644 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/domain/BlobMetadata.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/domain/BlobMetadata.java @@ -23,120 +23,23 @@ */ package org.jclouds.blobstore.domain; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.Serializable; import java.util.Map; -import javax.inject.Inject; -import javax.ws.rs.core.MediaType; - +import org.jclouds.blobstore.internal.BlobMetadataImpl; import org.joda.time.DateTime; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Maps; import com.google.common.collect.Multimap; +import com.google.inject.ImplementedBy; /** * System and user Metadata for the {@link Blob}. * * @author Adrian Cole */ -public class BlobMetadata implements Comparable, Serializable { - /** The serialVersionUID */ - private static final long serialVersionUID = -5932618957134612231L; +@ImplementedBy(BlobMetadataImpl.class) +public interface BlobMetadata { - protected String key; - protected String eTag; - protected volatile long size = -1; - private byte[] contentMD5; - - protected Multimap allHeaders = HashMultimap.create(); - protected Map userMetadata = Maps.newHashMap(); - protected DateTime lastModified; - protected String dataType = MediaType.APPLICATION_OCTET_STREAM; - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("BlobMetadata [key=").append(key).append(", eTag=").append(eTag).append( - ", lastModified=").append(lastModified).append(", size=").append(size).append( - ", dataType=").append(dataType).append(", userMetadata=").append(userMetadata) - .append("]"); - return builder.toString(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((dataType == null) ? 0 : dataType.hashCode()); - result = prime * result + ((eTag == null) ? 0 : eTag.hashCode()); - result = prime * result + ((key == null) ? 0 : key.hashCode()); - result = prime * result + ((lastModified == null) ? 0 : lastModified.hashCode()); - result = prime * result + (int) (size ^ (size >>> 32)); - result = prime * result + ((userMetadata == null) ? 0 : userMetadata.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - BlobMetadata other = (BlobMetadata) obj; - if (dataType == null) { - if (other.dataType != null) - return false; - } else if (!dataType.equals(other.dataType)) - return false; - if (eTag == null) { - if (other.eTag != null) - return false; - } else if (!eTag.equals(other.eTag)) - return false; - if (key == null) { - if (other.key != null) - return false; - } else if (!key.equals(other.key)) - return false; - if (lastModified == null) { - if (other.lastModified != null) - return false; - } else if (!lastModified.equals(other.lastModified)) - return false; - if (size != other.size) - return false; - if (userMetadata == null) { - if (other.userMetadata != null) - return false; - } else if (!userMetadata.equals(other.userMetadata)) - return false; - return true; - } - - @Inject - public BlobMetadata() { - super(); - } - - /** - * @param key - * @see #getKey() - */ - public BlobMetadata(String key) { - setKey(key); - } - - public void setKey(String key) { - checkNotNull(key, "key"); - checkArgument(!key.startsWith("/"), "keys cannot start with /"); - this.key = key; - } + void setName(String key); /** * The key is the handle that you assign to an object that allows you retrieve it later. A key is @@ -145,30 +48,20 @@ public class BlobMetadata implements Comparable, Serializable { * * @see */ - public String getKey() { - return key; - } + String getName(); - public DateTime getLastModified() { - return lastModified; - } + DateTime getLastModified(); - public void setLastModified(DateTime lastModified) { - this.lastModified = lastModified; - } + void setLastModified(DateTime lastModified); /** * The size of the object, in bytes. * * @see */ - public long getSize() { - return size; - } + long getSize(); - public void setSize(long size) { - this.size = size; - } + void setSize(long size); /** * A standard MIME type describing the format of the contents. If none is provided, the default @@ -176,65 +69,28 @@ public class BlobMetadata implements Comparable, Serializable { * * @see */ - public String getContentType() { - return dataType; - } + String getContentType(); - public void setContentType(String dataType) { - this.dataType = dataType; - } + void setContentType(String dataType); - public void setContentMD5(byte[] contentMD5) { - if (contentMD5 != null) { - this.contentMD5 = new byte[contentMD5.length]; - System.arraycopy(contentMD5, 0, this.contentMD5, 0, contentMD5.length); - } - } + void setContentMD5(byte[] contentMD5); - public byte[] getContentMD5() { - if (contentMD5 != null) { - byte[] retval = new byte[contentMD5.length]; - System.arraycopy(this.contentMD5, 0, retval, 0, contentMD5.length); - return retval; - } else { - return null; - } - } + byte[] getContentMD5(); - public void setETag(String eTag) { - this.eTag = eTag; - } + void setETag(String eTag); /** * @return the eTag value stored in the Etag header returned by HTTP. */ - public String getETag() { - return eTag; - } + String getETag(); - public void setUserMetadata(Map userMetadata) { - this.userMetadata = userMetadata; - } + void setUserMetadata(Map userMetadata); /** * Any key-value pairs associated with the object. */ - public Map getUserMetadata() { - return userMetadata; - } + Map getUserMetadata(); - public void setAllHeaders(Multimap allHeaders) { - this.allHeaders = allHeaders; - } + Multimap getAllHeaders(); - /** - * @return all http response headers associated with this Value - */ - public Multimap getAllHeaders() { - return allHeaders; - } - - public int compareTo(BlobMetadata o) { - return (this == o) ? 0 : getKey().compareTo(o.getKey()); - } } \ No newline at end of file diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/domain/ContainerMetadata.java b/blobstore/core/src/main/java/org/jclouds/blobstore/domain/ContainerMetadata.java index fb264802b7..e3269fd61e 100644 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/domain/ContainerMetadata.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/domain/ContainerMetadata.java @@ -23,62 +23,20 @@ */ package org.jclouds.blobstore.domain; -import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.blobstore.internal.ContainerMetadataImpl; + +import com.google.inject.ImplementedBy; /** * System metadata of the Container * * @author Adrian Cole */ -public class ContainerMetadata implements Comparable { +@ImplementedBy(ContainerMetadataImpl.class) +public interface ContainerMetadata { - protected String name; + void setName(String name); - /** - * @see #getName() - */ - public ContainerMetadata(String name) { - this.name = checkNotNull(name, "name"); - } + String getName(); - public ContainerMetadata() { - super(); - } - - public void setName(String name) { - this.name = checkNotNull(name, "name"); - } - - public String getName() { - return name; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ContainerMetadata other = (ContainerMetadata) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } - - public int compareTo(ContainerMetadata o) { - return (this == o) ? 0 : getName().compareTo(o.getName()); - } } \ No newline at end of file diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/functions/BlobKey.java b/blobstore/core/src/main/java/org/jclouds/blobstore/functions/BlobName.java similarity index 92% rename from blobstore/core/src/main/java/org/jclouds/blobstore/functions/BlobKey.java rename to blobstore/core/src/main/java/org/jclouds/blobstore/functions/BlobName.java index a8eca3ba05..fb4fb80e7e 100755 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/functions/BlobKey.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/functions/BlobName.java @@ -28,11 +28,11 @@ import org.jclouds.blobstore.domain.BlobMetadata; import com.google.common.base.Function; -public class BlobKey implements Function { +public class BlobName implements Function { @SuppressWarnings("unchecked") public String apply(Object from) { - return ((Blob) from).getKey(); + return ((Blob) from).getName(); } } diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/functions/ParseContentTypeFromHeaders.java b/blobstore/core/src/main/java/org/jclouds/blobstore/functions/ParseContentTypeFromHeaders.java index af0b32a411..b748256240 100644 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/functions/ParseContentTypeFromHeaders.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/functions/ParseContentTypeFromHeaders.java @@ -52,7 +52,7 @@ public class ParseContentTypeFromHeaders implements public M apply(HttpResponse from) { String objectKey = getKeyFor(from); M to = metadataFactory.get(); - to.setKey(objectKey); + to.setName(objectKey); addAllHeadersTo(from, to); setContentTypeOrThrowException(from, to); return to; diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BaseBlobMap.java b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BaseBlobMap.java index 94c1cbe92b..16d302546b 100755 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BaseBlobMap.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BaseBlobMap.java @@ -140,7 +140,7 @@ public abstract class BaseBlobMap keySet() { Set keys = Sets.newHashSet(); for (BlobMetadata object : getAllBlobMetadata.execute(connection, containerName)) - keys.add(object.getKey()); + keys.add(object.getName()); return keys; } diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobImpl.java b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobImpl.java new file mode 100644 index 0000000000..37f87bc408 --- /dev/null +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobImpl.java @@ -0,0 +1,226 @@ +/** + * + * Copyright (C) 2009 Global Cloud Specialists, Inc. + * + * ==================================================================== + * 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.blobstore.internal; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +import java.io.IOException; +import java.io.InputStream; + +import javax.inject.Inject; + +import org.jclouds.blobstore.domain.Blob; +import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.blobstore.domain.ContainerMetadata; +import org.jclouds.http.HttpUtils; +import org.jclouds.http.HttpUtils.MD5InputStreamResult; + +/** + * Value type for an HTTP Blob service. Blobs are stored in {@link ContainerMetadata containers} and consist + * of a {@link org.jclouds.blobstore.domain.Value#getData() value}, a {@link Blob#getKey key and + * + * @link Blob.Metadata#getUserMetadata() metadata} + * + * @author Adrian Cole + */ +public class BlobImpl implements Blob, Comparable> { + + @SuppressWarnings("unchecked") + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + BlobImpl other = (BlobImpl) obj; + if (contentLength != other.contentLength) + return false; + if (contentRange == null) { + if (other.contentRange != null) + return false; + } else if (!contentRange.equals(other.contentRange)) + return false; + if (data == null) { + if (other.data != null) + return false; + } else if (!data.equals(other.data)) + return false; + if (getMetadata() == null) { + if (other.getMetadata() != null) + return false; + } else if (!getMetadata().equals(other.getMetadata())) + return false; + return true; + } + + @Override + public String toString() { + return "Blob [contentLength=" + contentLength + ", contentRange=" + contentRange + ", data=" + + data + ", metadata=" + getMetadata() + "]"; + } + + protected Object data; + private M metadata; + protected long contentLength = -1; + protected String contentRange; + + @SuppressWarnings("unchecked") + public BlobImpl(String key) { + // TODO: why are we getting a generic warning here? + this((M) new BlobMetadataImpl(key)); + } + + @SuppressWarnings("unchecked") + @Inject + public BlobImpl() { + this((M) new BlobMetadataImpl()); + } + + public BlobImpl(M metadata) { + this.setMetadata(metadata); + } + + public BlobImpl(M metadata, Object data) { + this(metadata); + setData(data); + } + + public BlobImpl(String key, Object data) { + this(key); + setData(data); + } + + /** + * @see BlobMetadata#getName() + */ + public String getName() { + return getMetadata().getName(); + } + + /** + * Sets entity for the request or the content from the response. If size isn't set, this will + * attempt to discover it. + * + * @param data + * typically InputStream for downloads, or File, byte [], String, or InputStream for + * uploads. + */ + public void setData(Object data) { + this.data = checkNotNull(data, "data"); + if (getMetadata().getSize() == -1) + this.getMetadata().setSize(HttpUtils.calculateSize(data)); + } + + /** + * generate an MD5 Hash for the current data. + *

+ *

Note

+ *

+ * If this is an InputStream, it will be converted to a byte array first. + * + * @throws IOException + * if there is a problem generating the hash. + */ + public void generateMD5() throws IOException { + checkState(data != null, "data"); + if (data instanceof InputStream) { + MD5InputStreamResult result = HttpUtils.generateMD5Result((InputStream) data); + getMetadata().setSize(result.length); + getMetadata().setContentMD5(result.eTag); + setData(result.data); + } else { + getMetadata().setContentMD5(HttpUtils.md5(data)); + } + } + + /** + * @return InputStream, if downloading, or whatever was set during {@link #setData(Object)} + */ + public Object getData() { + return data; + } + + /** + * @return System and User metadata relevant to this object. + */ + public M getMetadata() { + return metadata; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (contentLength ^ (contentLength >>> 32)); + result = prime * result + ((contentRange == null) ? 0 : contentRange.hashCode()); + result = prime * result + ((data == null) ? 0 : data.hashCode()); + result = prime * result + ((getMetadata() == null) ? 0 : getMetadata().hashCode()); + return result; + } + + public void setContentLength(long contentLength) { + this.contentLength = contentLength; + } + + /** + * Returns the total size of the downloaded object, or the chunk that's available. + *

+ * Chunking is only used when org.jclouds.http.GetOptions is called with options like tail, + * range, or startAt. + * + * @return the length in bytes that can be be obtained from {@link #getData()} + * @see org.jclouds.http.HttpHeaders#CONTENT_LENGTH + * @see GetObjectOptions + */ + public long getContentLength() { + return contentLength; + } + + public void setContentRange(String contentRange) { + this.contentRange = contentRange; + } + + /** + * If this is not-null, {@link #getContentLength() } will the size of chunk of the Value available + * via {@link #getData()} + * + * @see org.jclouds.http.HttpHeaders#CONTENT_RANGE + * @see GetObjectOptions + */ + public String getContentRange() { + return contentRange; + } + + public void setMetadata(M metadata) { + this.metadata = metadata; + } + + public int compareTo(Blob o) { + return (this == o) ? 0 : getName().compareTo(o.getName()); + } + +} diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobMapImpl.java b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobMapImpl.java index 2d862fee97..ab5d864ca8 100755 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobMapImpl.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobMapImpl.java @@ -79,7 +79,7 @@ public class BlobMapImpl> entrySet() { Set> entrySet = new HashSet>(); for (B value : values()) { - Map.Entry entry = new Entry(value.getKey(), value); + Map.Entry entry = new Entry(value.getName(), value); entrySet.add(entry); } return entrySet; diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobMetadataImpl.java b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobMetadataImpl.java new file mode 100644 index 0000000000..bcec200f12 --- /dev/null +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/BlobMetadataImpl.java @@ -0,0 +1,247 @@ +/** + * + * Copyright (C) 2009 Global Cloud Specialists, Inc. + * + * ==================================================================== + * 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.blobstore.internal; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.Map; + +import javax.inject.Inject; +import javax.ws.rs.core.MediaType; + +import org.jclouds.blobstore.domain.Blob; +import org.jclouds.blobstore.domain.BlobMetadata; +import org.joda.time.DateTime; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; + +/** + * System and user Metadata for the {@link Blob}. + * + * @author Adrian Cole + */ +public class BlobMetadataImpl implements Serializable, BlobMetadata, Comparable { + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + BlobMetadataImpl other = (BlobMetadataImpl) obj; + if (!Arrays.equals(contentMD5, other.contentMD5)) + return false; + if (dataType == null) { + if (other.dataType != null) + return false; + } else if (!dataType.equals(other.dataType)) + return false; + if (eTag == null) { + if (other.eTag != null) + return false; + } else if (!eTag.equals(other.eTag)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (lastModified == null) { + if (other.lastModified != null) + return false; + } else if (!lastModified.equals(other.lastModified)) + return false; + if (size != other.size) + return false; + if (userMetadata == null) { + if (other.userMetadata != null) + return false; + } else if (!userMetadata.equals(other.userMetadata)) + return false; + return true; + } + + /** The serialVersionUID */ + private static final long serialVersionUID = -5932618957134612231L; + + protected String name; + protected String eTag; + protected volatile long size = -1; + private byte[] contentMD5; + + protected Multimap allHeaders = HashMultimap.create(); + protected Map userMetadata = Maps.newHashMap(); + protected DateTime lastModified; + protected String dataType = MediaType.APPLICATION_OCTET_STREAM; + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("BlobMetadata [name=").append(name).append(", eTag=").append(eTag).append( + ", lastModified=").append(lastModified).append(", size=").append(size).append( + ", dataType=").append(dataType).append(", userMetadata=").append(userMetadata) + .append("]"); + return builder.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(contentMD5); + result = prime * result + ((dataType == null) ? 0 : dataType.hashCode()); + result = prime * result + ((eTag == null) ? 0 : eTag.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((lastModified == null) ? 0 : lastModified.hashCode()); + result = prime * result + (int) (size ^ (size >>> 32)); + result = prime * result + ((userMetadata == null) ? 0 : userMetadata.hashCode()); + return result; + } + + @Inject + public BlobMetadataImpl() { + super(); + } + + /** + * @param name + * @see #getKey() + */ + public BlobMetadataImpl(String name) { + setName(name); + } + + public void setName(String name) { + checkNotNull(name, "name"); + checkArgument(!name.startsWith("/"), "names cannot start with /"); + this.name = name; + } + + /** + * The name is the handle that you assign to an object that allows you retrieve it later. A name + * is a sequence of Unicode characters whose UTF-8 encoding is at most 1024 bytes long. Each + * object in a bucket must have a unique name. + * + * @see + */ + public String getName() { + return name; + } + + public DateTime getLastModified() { + return lastModified; + } + + public void setLastModified(DateTime lastModified) { + this.lastModified = lastModified; + } + + /** + * The size of the object, in bytes. + * + * @see + */ + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + /** + * A standard MIME type describing the format of the contents. If none is provided, the default + * is binary/octet-stream. + * + * @see + */ + public String getContentType() { + return dataType; + } + + public void setContentType(String dataType) { + this.dataType = dataType; + } + + public void setContentMD5(byte[] contentMD5) { + if (contentMD5 != null) { + this.contentMD5 = new byte[contentMD5.length]; + System.arraycopy(contentMD5, 0, this.contentMD5, 0, contentMD5.length); + } + } + + public byte[] getContentMD5() { + if (contentMD5 != null) { + byte[] retval = new byte[contentMD5.length]; + System.arraycopy(this.contentMD5, 0, retval, 0, contentMD5.length); + return retval; + } else { + return null; + } + } + + public void setETag(String eTag) { + this.eTag = eTag; + } + + /** + * @return the eTag value stored in the Etag header returned by HTTP. + */ + public String getETag() { + return eTag; + } + + public void setUserMetadata(Map userMetadata) { + this.userMetadata = userMetadata; + } + + /** + * Any key-value pairs associated with the object. + */ + public Map getUserMetadata() { + return userMetadata; + } + + public void setAllHeaders(Multimap allHeaders) { + this.allHeaders = allHeaders; + } + + /** + * @return all http response headers associated with this Value + */ + public Multimap getAllHeaders() { + return allHeaders; + } + + public int compareTo(BlobMetadata o) { + return (this == o) ? 0 : getName().compareTo(o.getName()); + } +} \ No newline at end of file diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/internal/ContainerMetadataImpl.java b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/ContainerMetadataImpl.java new file mode 100644 index 0000000000..d16c62733c --- /dev/null +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/ContainerMetadataImpl.java @@ -0,0 +1,86 @@ +/** + * + * Copyright (C) 2009 Global Cloud Specialists, Inc. + * + * ==================================================================== + * 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.blobstore.internal; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.blobstore.domain.ContainerMetadata; + +/** + * System metadata of the Container + * + * @author Adrian Cole + */ +public class ContainerMetadataImpl implements ContainerMetadata, Comparable { + + protected String name; + + /** + * @see #getName() + */ + public ContainerMetadataImpl(String name) { + this.name = checkNotNull(name, "name"); + } + + public ContainerMetadataImpl() { + super(); + } + + public void setName(String name) { + this.name = checkNotNull(name, "name"); + } + + public String getName() { + return name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ContainerMetadataImpl other = (ContainerMetadataImpl) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + public int compareTo(ContainerMetadata o) { + return (this == o) ? 0 : getName().compareTo(o.getName()); + } +} \ No newline at end of file diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/internal/InputStreamMapImpl.java b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/InputStreamMapImpl.java index 339f43bb32..c0ffc920c1 100755 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/internal/InputStreamMapImpl.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/internal/InputStreamMapImpl.java @@ -144,7 +144,7 @@ public class InputStreamMapImpl> entrySet() { Set> entrySet = new HashSet>(); for (B object : this.getAllBlobs.execute(connection, containerName)) { - entrySet.add(new Entry(object.getKey(), (InputStream) object.getData())); + entrySet.add(new Entry(object.getName(), (InputStream) object.getData())); } return entrySet; } @@ -226,7 +226,7 @@ public class InputStreamMapImpl> puts = Sets.newHashSet(); for (Map.Entry entry : map.entrySet()) { B object = blobFactory.get(); - object.getMetadata().setKey(entry.getKey()); + object.getMetadata().setName(entry.getKey()); object.setData(entry.getValue()); object.generateMD5(); puts.add(connection.putBlob(containerName, object)); @@ -288,7 +288,7 @@ public class InputStreamMapImpl connection, final String containerName) { Set> deletes = Sets.newHashSet(); for (M md : getAllBlobMetadata.execute(connection, containerName)) { - deletes.add(connection.removeBlob(containerName, md.getKey())); + deletes.add(connection.removeBlob(containerName, md.getName())); } for (Future isdeleted : deletes) { try { diff --git a/blobstore/core/src/main/java/org/jclouds/blobstore/strategy/internal/RetryOnNotFoundGetAllBlobsStrategy.java b/blobstore/core/src/main/java/org/jclouds/blobstore/strategy/internal/RetryOnNotFoundGetAllBlobsStrategy.java index 05f38f434a..fe04662756 100644 --- a/blobstore/core/src/main/java/org/jclouds/blobstore/strategy/internal/RetryOnNotFoundGetAllBlobsStrategy.java +++ b/blobstore/core/src/main/java/org/jclouds/blobstore/strategy/internal/RetryOnNotFoundGetAllBlobsStrategy.java @@ -23,6 +23,7 @@ */ package org.jclouds.blobstore.strategy.internal; +import java.util.Comparator; import java.util.Map; import java.util.Set; import java.util.SortedSet; @@ -78,10 +79,16 @@ public class RetryOnNotFoundGetAllBlobsStrategy execute(BlobStore connection, String container) { - SortedSet objects = Sets. newTreeSet(); + SortedSet objects = Sets. newTreeSet(new Comparator() { + + public int compare(B o1, B o2) { + return (o1 == o2) ? 0 : o1.getName().compareTo(o2.getName()); + } + + }); Map> futureObjects = Maps.newHashMap(); for (M md : getAllBlobMetadata.execute(connection, container)) { - futureObjects.put(md.getKey(), connection.getBlob(container, md.getKey())); + futureObjects.put(md.getName(), connection.getBlob(container, md.getName())); } for (Entry> futureObjectEntry : futureObjects.entrySet()) { try { @@ -103,7 +110,7 @@ public class RetryOnNotFoundGetAllBlobsStrategy("hello"); + TEST_BLOB = new BlobImpl("hello"); TEST_BLOB.setData("hello"); TEST_BLOB.getMetadata().setContentType(MediaType.TEXT_PLAIN); } diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/domain/BlobTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/domain/BlobTest.java index 4e1ab9b0e1..261cda18cf 100644 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/domain/BlobTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/domain/BlobTest.java @@ -29,6 +29,7 @@ import java.io.File; import javax.ws.rs.core.MediaType; +import org.jclouds.blobstore.internal.BlobImpl; import org.testng.annotations.Test; @Test(groups = "unit", testName = "blobstore.BlobTest") @@ -36,7 +37,7 @@ public class BlobTest { @Test void testSetNoContentType() { - Blob object = new Blob("test"); + Blob object = new BlobImpl("test"); File file = new File("hello.txt"); object.setData(file); assertEquals(object.getMetadata().getContentType(), MediaType.APPLICATION_OCTET_STREAM); diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/functions/ParseBlobFromHeadersAndHttpContentTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/functions/ParseBlobFromHeadersAndHttpContentTest.java index 51850d717a..4c69e98319 100755 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/functions/ParseBlobFromHeadersAndHttpContentTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/functions/ParseBlobFromHeadersAndHttpContentTest.java @@ -36,6 +36,7 @@ import javax.ws.rs.core.HttpHeaders; import org.apache.commons.io.IOUtils; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.blobstore.internal.BlobImpl; import org.jclouds.http.HttpException; import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; @@ -65,7 +66,7 @@ public class ParseBlobFromHeadersAndHttpContentTest { private Provider> blobProvider = new Provider>() { public Blob get() { - return new Blob("key"); + return new BlobImpl("key"); } }; diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/functions/ParseBlobMetadataFromHeadersTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/functions/ParseBlobMetadataFromHeadersTest.java index 5fe3693f4c..246a50dffc 100644 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/functions/ParseBlobMetadataFromHeadersTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/functions/ParseBlobMetadataFromHeadersTest.java @@ -36,6 +36,7 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.blobstore.internal.BlobMetadataImpl; import org.jclouds.http.HttpException; import org.jclouds.http.HttpResponse; import org.jclouds.rest.internal.GeneratedHttpRequest; @@ -52,7 +53,7 @@ public class ParseBlobMetadataFromHeadersTest { private Provider blobMetadataProvider = new Provider() { public BlobMetadata get() { - return new BlobMetadata("key"); + return new BlobMetadataImpl("key"); } }; @@ -74,7 +75,7 @@ public class ParseBlobMetadataFromHeadersTest { Multimap allHeaders = ImmutableMultimap.of("key", "value"); HttpResponse from = new HttpResponse(); from.setHeaders(allHeaders); - BlobMetadata metadata = new BlobMetadata("test"); + BlobMetadata metadata = new BlobMetadataImpl("test"); parser.addAllHeadersTo(from, metadata); assertEquals(metadata.getAllHeaders().get("key"), Collections.singletonList("value")); } @@ -86,14 +87,14 @@ public class ParseBlobMetadataFromHeadersTest { from.getHeaders().put(HttpHeaders.LAST_MODIFIED, "Wed, 09 Sep 2009 19:50:23 GMT"); from.getHeaders().put(HttpHeaders.CONTENT_LENGTH, "100"); BlobMetadata metadata = parser.apply(from); - assertEquals(metadata.getKey(), "key"); + assertEquals(metadata.getName(), "key"); } @Test public void testSetContentLength() { HttpResponse from = new HttpResponse(); from.getHeaders().put(HttpHeaders.CONTENT_LENGTH, "100"); - BlobMetadata metadata = new BlobMetadata("test"); + BlobMetadata metadata = new BlobMetadataImpl("test"); parser.setContentLengthOrThrowException(from, metadata); assertEquals(metadata.getSize(), 100); } @@ -101,7 +102,7 @@ public class ParseBlobMetadataFromHeadersTest { @Test(expectedExceptions = HttpException.class) public void testSetContentLengthException() { HttpResponse from = new HttpResponse(); - BlobMetadata metadata = new BlobMetadata("test"); + BlobMetadata metadata = new BlobMetadataImpl("test"); parser.setContentLengthOrThrowException(from, metadata); } @@ -109,7 +110,7 @@ public class ParseBlobMetadataFromHeadersTest { public void testSetContentType() { HttpResponse from = new HttpResponse(); from.getHeaders().put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); - BlobMetadata metadata = new BlobMetadata("test"); + BlobMetadata metadata = new BlobMetadataImpl("test"); parser.setContentTypeOrThrowException(from, metadata); assertEquals(metadata.getContentType(), MediaType.APPLICATION_JSON); } @@ -117,7 +118,7 @@ public class ParseBlobMetadataFromHeadersTest { @Test(expectedExceptions = HttpException.class) public void testSetContentTypeException() { HttpResponse from = new HttpResponse(); - BlobMetadata metadata = new BlobMetadata("test"); + BlobMetadata metadata = new BlobMetadataImpl("test"); parser.setContentTypeOrThrowException(from, metadata); } @@ -125,7 +126,7 @@ public class ParseBlobMetadataFromHeadersTest { public void testSetLastModified() { HttpResponse from = new HttpResponse(); from.getHeaders().put(HttpHeaders.LAST_MODIFIED, "Wed, 09 Sep 2009 19:50:23 GMT"); - BlobMetadata metadata = new BlobMetadata("test"); + BlobMetadata metadata = new BlobMetadataImpl("test"); parser.parseLastModifiedOrThrowException(from, metadata); assertEquals(metadata.getLastModified(), new DateService() .rfc822DateParse("Wed, 09 Sep 2009 19:50:23 GMT")); @@ -134,7 +135,7 @@ public class ParseBlobMetadataFromHeadersTest { @Test(expectedExceptions = HttpException.class) public void testSetLastModifiedException() { HttpResponse from = new HttpResponse(); - BlobMetadata metadata = new BlobMetadata("test"); + BlobMetadata metadata = new BlobMetadataImpl("test"); parser.parseLastModifiedOrThrowException(from, metadata); } @@ -142,7 +143,7 @@ public class ParseBlobMetadataFromHeadersTest { public void testAddETagTo() { HttpResponse from = new HttpResponse(); from.getHeaders().put(HttpHeaders.ETAG, "0xfeb"); - BlobMetadata metadata = new BlobMetadata("test"); + BlobMetadata metadata = new BlobMetadataImpl("test"); parser.addETagTo(from, metadata); assertEquals(metadata.getETag(), "0xfeb"); } @@ -152,7 +153,7 @@ public class ParseBlobMetadataFromHeadersTest { Multimap allHeaders = ImmutableMultimap.of("prefix" + "key", "value"); HttpResponse from = new HttpResponse(); from.setHeaders(allHeaders); - BlobMetadata metadata = new BlobMetadata("test"); + BlobMetadata metadata = new BlobMetadataImpl("test"); parser.addUserMetadataTo(from, metadata); assertEquals(metadata.getUserMetadata().get("key"), "value"); } diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubBlobIntegrationTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubBlobIntegrationTest.java index 9b5bbbaba6..c2ddf53ad3 100755 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubBlobIntegrationTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubBlobIntegrationTest.java @@ -26,8 +26,8 @@ package org.jclouds.blobstore.integration; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; -import org.jclouds.blobstore.domain.ContainerMetadata; import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest; +import org.jclouds.blobstore.internal.ContainerMetadataImpl; import org.testng.annotations.Test; /** @@ -37,6 +37,6 @@ import org.testng.annotations.Test; */ @Test(groups = { "integration"}, testName = "blobstore.StubBlobIntegrationTest") public class StubBlobIntegrationTest extends - BaseBlobIntegrationTest>, ContainerMetadata, BlobMetadata, Blob> { + BaseBlobIntegrationTest>, ContainerMetadataImpl, BlobMetadata, Blob> { } \ No newline at end of file diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubBlobMapIntegrationTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubBlobMapIntegrationTest.java index ecb98dc0bb..449335eb15 100644 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubBlobMapIntegrationTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubBlobMapIntegrationTest.java @@ -26,8 +26,8 @@ package org.jclouds.blobstore.integration; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; -import org.jclouds.blobstore.domain.ContainerMetadata; import org.jclouds.blobstore.integration.internal.BaseBlobMapIntegrationTest; +import org.jclouds.blobstore.internal.ContainerMetadataImpl; import org.testng.annotations.Test; /** @@ -36,6 +36,6 @@ import org.testng.annotations.Test; @Test(groups = { "integration", "live" }, testName = "blobstore.StubBlobMapIntegrationTest") public class StubBlobMapIntegrationTest extends - BaseBlobMapIntegrationTest>, ContainerMetadata, BlobMetadata, Blob> { + BaseBlobMapIntegrationTest>, ContainerMetadataImpl, BlobMetadata, Blob> { } \ No newline at end of file diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubContainerIntegrationTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubContainerIntegrationTest.java index 35fa2f6a3b..fc0c71e099 100755 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubContainerIntegrationTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubContainerIntegrationTest.java @@ -26,8 +26,8 @@ package org.jclouds.blobstore.integration; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; -import org.jclouds.blobstore.domain.ContainerMetadata; import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest; +import org.jclouds.blobstore.internal.ContainerMetadataImpl; import org.testng.annotations.Test; /** @@ -37,6 +37,6 @@ import org.testng.annotations.Test; @Test(groups = { "integration", "live" }, testName = "blobstore.StubContainerIntegrationTest") public class StubContainerIntegrationTest extends - BaseContainerIntegrationTest>, ContainerMetadata, BlobMetadata, Blob> { + BaseContainerIntegrationTest>, ContainerMetadataImpl, BlobMetadata, Blob> { } \ No newline at end of file diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubInputStreamMapIntegrationTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubInputStreamMapIntegrationTest.java index bdbc9c7424..5c04fd0234 100644 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubInputStreamMapIntegrationTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubInputStreamMapIntegrationTest.java @@ -26,8 +26,8 @@ package org.jclouds.blobstore.integration; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; -import org.jclouds.blobstore.domain.ContainerMetadata; import org.jclouds.blobstore.integration.internal.BaseInputStreamMapIntegrationTest; +import org.jclouds.blobstore.internal.ContainerMetadataImpl; import org.testng.annotations.Test; /** @@ -35,6 +35,6 @@ import org.testng.annotations.Test; */ @Test(groups = { "integration", "live" }, testName = "blobstore.StubInputStreamMapIntegrationTest") public class StubInputStreamMapIntegrationTest extends - BaseInputStreamMapIntegrationTest>, ContainerMetadata, BlobMetadata, Blob> { + BaseInputStreamMapIntegrationTest>, ContainerMetadataImpl, BlobMetadata, Blob> { } \ No newline at end of file diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubServiceIntegrationTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubServiceIntegrationTest.java index ac5b96059e..8333c93c5b 100644 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubServiceIntegrationTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/StubServiceIntegrationTest.java @@ -26,8 +26,8 @@ package org.jclouds.blobstore.integration; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; -import org.jclouds.blobstore.domain.ContainerMetadata; import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest; +import org.jclouds.blobstore.internal.ContainerMetadataImpl; import org.testng.annotations.Test; /** @@ -36,6 +36,6 @@ import org.testng.annotations.Test; @Test(groups = { "integration", "live" }, testName = "blobstore.StubServiceIntegrationTest") public class StubServiceIntegrationTest extends - BaseServiceIntegrationTest>, ContainerMetadata, BlobMetadata, Blob> { + BaseServiceIntegrationTest>, ContainerMetadataImpl, BlobMetadata, Blob> { } \ No newline at end of file diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/config/StubBlobStoreConnectionModule.java b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/config/StubBlobStoreConnectionModule.java index 578e754c9b..744b1da496 100644 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/config/StubBlobStoreConnectionModule.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/config/StubBlobStoreConnectionModule.java @@ -46,8 +46,11 @@ public class StubBlobStoreConnectionModule extends AbstractModule { protected void configure() { bind(new TypeLiteral>>>() { }).toInstance(map); - bind(new TypeLiteral>>() { - }).to(new TypeLiteral>>() { - }).asEagerSingleton(); + bind( + new TypeLiteral>>() { + }) + .to( + new TypeLiteral>>() { + }).asEagerSingleton(); } } \ No newline at end of file diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java index a7cd9a5b07..6e57f0b75d 100755 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java @@ -357,7 +357,7 @@ public class BaseBlobIntegrationTest testContainers = Iterables.filter( - (SortedSet) context.getBlobStore().listContainers(), - new Predicate() { - public boolean apply(ContainerMetadata input) { + Iterable testContainers = Iterables.filter( + (SortedSet) context.getBlobStore().listContainers(), + new Predicate() { + public boolean apply(ContainerMetadataImpl input) { return input.getName().startsWith(CONTAINER_PREFIX.toLowerCase()); } }); diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/BaseServiceIntegrationTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/BaseServiceIntegrationTest.java index f5e81d0cd3..330729cd18 100755 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/BaseServiceIntegrationTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/BaseServiceIntegrationTest.java @@ -28,6 +28,7 @@ import java.util.SortedSet; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; import org.jclouds.blobstore.domain.ContainerMetadata; +import org.jclouds.blobstore.internal.ContainerMetadataImpl; import org.testng.annotations.Test; /** @@ -40,7 +41,7 @@ public class BaseServiceIntegrationTest list = context.getBlobStore().listContainers(); - assert !list.contains(new ContainerMetadata("shouldntexist")); + assert !list.contains(new ContainerMetadataImpl("shouldntexist")); } } \ No newline at end of file diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/StubBlobStore.java b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/StubBlobStore.java index c7edb46302..34835bdbcc 100755 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/StubBlobStore.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/integration/internal/StubBlobStore.java @@ -35,6 +35,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.util.Collection; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.SortedSet; @@ -146,14 +147,22 @@ public class StubBlobStore contents = Sets.newTreeSet(Iterables.transform(realContents.keySet(), + SortedSet contents = Sets.newTreeSet(new Comparator() { + + public int compare(M o1, M o2) { + return (o1 == o2) ? 0 : o1.getName().compareTo(o2.getName()); + } + + }); + + Iterables.addAll(contents, Iterables.transform(realContents.keySet(), new Function() { public M apply(String key) { return realContents.get(key).getMetadata(); } })); - return Sets.newTreeSet(contents); + return contents; } }; } @@ -184,7 +193,7 @@ public class StubBlobStore listContainers() { - return Sets.newTreeSet(Iterables.transform(getContainerToBlobs().keySet(), + SortedSet returnVal = Sets.newTreeSet(new Comparator() { + + public int compare(C o1, C o2) { + return (o1 == o2) ? 0 : o1.getName().compareTo(o2.getName()); + } + + }); + Iterables.addAll(returnVal, Iterables.transform(getContainerToBlobs().keySet(), new Function() { public C apply(String name) { C cmd = containerMetaProvider.get(); @@ -266,6 +282,7 @@ public class StubBlobStore createContainer(final String name) { @@ -297,9 +314,9 @@ public class StubBlobStore>, ContainerMetadata, BlobMetadata, Blob>>() { + TypeLiteral type6 = new TypeLiteral>, ContainerMetadata, BlobMetadata, Blob>>() { }; - TypeLiteral type7 = TypeLiteral.get(Types.newParameterizedType(BlobStoreContextImpl.class, - Types.newParameterizedType(BlobStore.class, ContainerMetadata.class, - BlobMetadata.class, Types.newParameterizedType(Blob.class, - BlobMetadata.class)), ContainerMetadata.class, BlobMetadata.class, - Types.newParameterizedType(Blob.class, BlobMetadata.class))); + TypeLiteral type7 = TypeLiteral.get(Types.newParameterizedType(BlobStoreContext.class, Types + .newParameterizedType(BlobStore.class, ContainerMetadata.class, BlobMetadata.class, + Types.newParameterizedType(Blob.class, BlobMetadata.class)), + ContainerMetadata.class, BlobMetadata.class, Types.newParameterizedType(Blob.class, + BlobMetadata.class))); assertEquals(type6, type7); } diff --git a/blobstore/core/src/test/java/org/jclouds/blobstore/strategy/internal/RetryOnNotFoundGetAllBlobsStrategyTest.java b/blobstore/core/src/test/java/org/jclouds/blobstore/strategy/internal/RetryOnNotFoundGetAllBlobsStrategyTest.java index ac02488025..2e559655c3 100644 --- a/blobstore/core/src/test/java/org/jclouds/blobstore/strategy/internal/RetryOnNotFoundGetAllBlobsStrategyTest.java +++ b/blobstore/core/src/test/java/org/jclouds/blobstore/strategy/internal/RetryOnNotFoundGetAllBlobsStrategyTest.java @@ -25,7 +25,6 @@ package org.jclouds.blobstore.strategy.internal; import static org.easymock.EasyMock.expect; import static org.easymock.classextension.EasyMock.createMock; -import static org.easymock.classextension.EasyMock.createNiceMock; import static org.easymock.classextension.EasyMock.replay; import java.util.HashSet; @@ -40,6 +39,7 @@ import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; import org.jclouds.blobstore.domain.ContainerMetadata; import org.jclouds.blobstore.integration.StubBlobStoreContextBuilder; +import org.jclouds.blobstore.internal.BlobImpl; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -73,7 +73,7 @@ public class RetryOnNotFoundGetAllBlobsStrategyTest { public void testIfNotFoundRetryOtherwiseAddToSet() throws InterruptedException, ExecutionException, TimeoutException { Future> futureObject = createMock(Future.class); - Blob object = new Blob("key"); + Blob object = new BlobImpl("key"); expect(futureObject.get(map.requestTimeoutMilliseconds, TimeUnit.MILLISECONDS)).andThrow( new KeyNotFoundException()); expect(futureObject.get(map.requestTimeoutMilliseconds, TimeUnit.MILLISECONDS)).andReturn( @@ -92,7 +92,7 @@ public class RetryOnNotFoundGetAllBlobsStrategyTest { public void testIfNotFoundRetryOtherwiseAddToSetButNeverGetsIt() throws InterruptedException, ExecutionException, TimeoutException { Future> futureObject = createMock(Future.class); - Blob object = createNiceMock(Blob.class); + Blob object = createMock(Blob.class); expect(futureObject.get(map.requestTimeoutMilliseconds, TimeUnit.MILLISECONDS)).andThrow( new KeyNotFoundException()).atLeastOnce(); replay(futureObject); diff --git a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/binders/BindFileInfoToXmlEntity.java b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/binders/BindFileInfoToXmlEntity.java index 2ddd6f92be..8310afa522 100644 --- a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/binders/BindFileInfoToXmlEntity.java +++ b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/binders/BindFileInfoToXmlEntity.java @@ -42,7 +42,7 @@ public class BindFileInfoToXmlEntity implements Binder { public void bindToRequest(HttpRequest request, Object toBind) { Blob blob = (Blob) toBind; - String bareKey = BlobStoreUtils.parseKey(new Key("trash", blob.getKey())).getKey(); + String bareKey = BlobStoreUtils.parseKey(new Key("trash", blob.getName())).getKey(); String file = String.format( "%s%sfalse", bareKey, blob.getMetadata().getContentType()); diff --git a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/ContainerMetadata.java b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/ContainerMetadata.java index db28892888..171d3e366e 100644 --- a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/ContainerMetadata.java +++ b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/ContainerMetadata.java @@ -32,7 +32,7 @@ import org.joda.time.DateTime; * @author Adrian Cole * */ -public class ContainerMetadata extends org.jclouds.blobstore.domain.ContainerMetadata implements +public class ContainerMetadata extends org.jclouds.blobstore.internal.ContainerMetadataImpl implements PCSObject { private URI url; private URI parent; diff --git a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/FileMetadata.java b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/FileMetadata.java index 7cba812a82..2596367b72 100644 --- a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/FileMetadata.java +++ b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/FileMetadata.java @@ -25,6 +25,7 @@ package org.jclouds.mezeo.pcs2.domain; import java.net.URI; +import org.jclouds.blobstore.internal.BlobMetadataImpl; import org.jclouds.mezeo.pcs2.util.PCSUtils; import org.joda.time.DateTime; @@ -33,7 +34,7 @@ import org.joda.time.DateTime; * @author Adrian Cole * */ -public class FileMetadata extends org.jclouds.blobstore.domain.BlobMetadata { +public class FileMetadata extends BlobMetadataImpl { /** The serialVersionUID */ private static final long serialVersionUID = 1L; private URI url; @@ -47,7 +48,7 @@ public class FileMetadata extends org.jclouds.blobstore.domain.BlobMetadata { @Override public String toString() { - return "FileMetadata [key=" + key + ", created=" + created + ", isInProject=" + isInProject + return "FileMetadata [key=" + name + ", created=" + created + ", isInProject=" + isInProject + ", isPublic=" + isPublic + ", isShared=" + isShared + ", owner=" + owner + ", url=" + url + ", version=" + version + ", allHeaders=" + allHeaders + ", dataType=" + dataType + ", eTag=" + eTag + ", accessed=" diff --git a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/PCSFile.java b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/PCSFile.java index d64fc7504f..ddc5691310 100644 --- a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/PCSFile.java +++ b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/domain/PCSFile.java @@ -23,11 +23,13 @@ */ package org.jclouds.mezeo.pcs2.domain; +import org.jclouds.blobstore.internal.BlobImpl; + /** * @author Adrian Cole */ -public class PCSFile extends org.jclouds.blobstore.domain.Blob { +public class PCSFile extends BlobImpl { public PCSFile(FileMetadata metadata, FileMetadata data) { super(metadata, data); diff --git a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/AddMetadataAndReturnId.java b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/AddMetadataAndReturnId.java index d5e3ff8721..d41ffef4e8 100644 --- a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/AddMetadataAndReturnId.java +++ b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/AddMetadataAndReturnId.java @@ -89,7 +89,7 @@ public class AddMetadataAndReturnId implements Function, String container = request.getArgs()[0].toString(); PCSFile file = (PCSFile) request.getArgs()[1]; - Key key = new Key(container, file.getKey()); + Key key = new Key(container, file.getName()); String id = checkNotNull(fileCache.get(key), String.format( "file %s should have an id in cache by now", key)); diff --git a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/CreateSubFolderIfNotExistsAndGetResourceId.java b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/CreateSubFolderIfNotExistsAndGetResourceId.java index b5e25950d6..cd134802d5 100644 --- a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/CreateSubFolderIfNotExistsAndGetResourceId.java +++ b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/CreateSubFolderIfNotExistsAndGetResourceId.java @@ -87,7 +87,7 @@ public class CreateSubFolderIfNotExistsAndGetResourceId implements Function rethrowIfRuntimeOrSameType(e); diff --git a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/FindIdInFileList.java b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/FindIdInFileList.java index 3a06a7f627..8f5cf97d47 100644 --- a/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/FindIdInFileList.java +++ b/mezeo/pcs2/core/src/main/java/org/jclouds/mezeo/pcs2/functions/FindIdInFileList.java @@ -67,7 +67,7 @@ public class FindIdInFileList implements Function { String idForNameInListOrException(String container, String toFind, SortedSet response) { for (FileMetadata data : response) { - if (toFind.equals(data.getKey())) { + if (toFind.equals(data.getName())) { String path = data.getUrl().getPath(); int indexAfterContainersSlash = path.indexOf("files/") + "files/".length(); return path.substring(indexAfterContainersSlash); diff --git a/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSBlobStoreTest.java b/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSBlobStoreTest.java index 2157dba7c4..e69ecba257 100644 --- a/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSBlobStoreTest.java +++ b/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSBlobStoreTest.java @@ -202,7 +202,7 @@ public class PCSBlobStoreTest { return new StubBlobStore.FutureBase() { public URI get() throws InterruptedException, ExecutionException { - return URI.create("http://localhost/" + object.getKey()); + return URI.create("http://localhost/" + object.getName()); } }; } diff --git a/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSConnectionLiveTest.java b/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSConnectionLiveTest.java index cbf3f31934..d32110f79f 100644 --- a/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSConnectionLiveTest.java +++ b/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSConnectionLiveTest.java @@ -133,7 +133,7 @@ public class PCSConnectionLiveTest { connection.deleteFile(objectURI).get(10, TimeUnit.SECONDS); // try sending it in 2 parts - object.getMetadata().setKey("sad"); + object.getMetadata().setName("sad"); objectURI = connection.createFile(container, object).get(30, TimeUnit.SECONDS); object.setData(data.substring(0, 2)); diff --git a/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSConnectionTest.java b/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSConnectionTest.java index de4f7c541f..e279205471 100644 --- a/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSConnectionTest.java +++ b/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/PCSConnectionTest.java @@ -47,7 +47,7 @@ import org.jclouds.concurrent.config.ExecutorServiceModule; import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.http.functions.ParseSax; -import org.jclouds.http.functions.ParseURIList; +import org.jclouds.http.functions.ParseURIFromListOrLocationHeaderIf20x; import org.jclouds.http.functions.ReturnInputStream; import org.jclouds.http.functions.ReturnVoidIf2xx; import org.jclouds.logging.Logger; @@ -108,7 +108,7 @@ public class PCSConnectionTest { .singletonList("application/vnd.csp.container-info+xml")); assertEquals(httpMethod.getEntity(), "container"); assertEquals(processor.createResponseParser(method, httpMethod).getClass(), - ParseURIList.class); + ParseURIFromListOrLocationHeaderIf20x.class); // TODO check generic type of response parser } @@ -181,7 +181,7 @@ public class PCSConnectionTest { assertEquals(Utils.toStringAndClose((InputStream) httpMethod.getEntity()), BindBlobToMultipartFormTest.EXPECTS); assertEquals(processor.createResponseParser(method, httpMethod).getClass(), - ParseURIList.class); + ParseURIFromListOrLocationHeaderIf20x.class); } public void testDownloadFile() throws SecurityException, NoSuchMethodException, IOException { diff --git a/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/functions/AssembleBlobFromBlobMetadataCallTest.java b/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/functions/AssembleBlobFromBlobMetadataCallTest.java index 85a4e84cb2..c8c21e519e 100644 --- a/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/functions/AssembleBlobFromBlobMetadataCallTest.java +++ b/mezeo/pcs2/core/src/test/java/org/jclouds/mezeo/pcs2/functions/AssembleBlobFromBlobMetadataCallTest.java @@ -59,7 +59,7 @@ public class AssembleBlobFromBlobMetadataCallTest { replay(response); PCSFile file = callable.apply(response); assertEquals(file.getMetadata(), metadata); - assertEquals(file.getKey(), "blob"); + assertEquals(file.getName(), "blob"); assertEquals(file.getData(), data); assertEquals(file.getContentLength(), metadata.getSize()); } diff --git a/nirvanix/sdn/core/src/test/java/org/jclouds/nirvanix/sdn/SDNConnectionLiveTest.java b/nirvanix/sdn/core/src/test/java/org/jclouds/nirvanix/sdn/SDNConnectionLiveTest.java index cbaa58bc80..25d9108efb 100644 --- a/nirvanix/sdn/core/src/test/java/org/jclouds/nirvanix/sdn/SDNConnectionLiveTest.java +++ b/nirvanix/sdn/core/src/test/java/org/jclouds/nirvanix/sdn/SDNConnectionLiveTest.java @@ -33,9 +33,9 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest; +import org.jclouds.blobstore.internal.BlobImpl; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.nirvanix.sdn.domain.UploadInfo; import org.testng.annotations.BeforeGroups; @@ -77,7 +77,7 @@ public class SDNConnectionLiveTest { assertNotNull(uploadInfo.getToken()); connection.upload(uploadInfo.getHost(), uploadInfo.getToken(), containerName, - new Blob("test.txt", "value")).get(30, TimeUnit.SECONDS); + new BlobImpl("test.txt", "value")).get(30, TimeUnit.SECONDS); String metadataS = connection.getMetadata(containerName + "/test.txt").get(30, TimeUnit.SECONDS); diff --git a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesBlobStore.java b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesBlobStore.java index 966e0a9ee6..1e74166b30 100644 --- a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesBlobStore.java +++ b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesBlobStore.java @@ -35,10 +35,10 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import org.jclouds.blobstore.BlobStore; -import org.jclouds.blobstore.binders.BindBlobToEntity; +import org.jclouds.blobstore.binders.BindBlobToEntityAndUserMetadataToHeadersWithPrefix; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; -import org.jclouds.blobstore.functions.BlobKey; +import org.jclouds.blobstore.functions.BlobName; import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404; import org.jclouds.http.functions.ParseETagHeader; @@ -113,7 +113,7 @@ public interface CloudFilesBlobStore extends @ResponseParser(ParseETagHeader.class) Future putBlob( @PathParam("container") String container, - @PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindBlobToEntity.class) Blob object); + @PathParam("key") @ParamParser(BlobName.class) @BinderParam(BindBlobToEntityAndUserMetadataToHeadersWithPrefix.class) Blob object); @GET @ResponseParser(ParseObjectFromHeadersAndHttpContent.class) diff --git a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesConnection.java b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesConnection.java index 50e811a2ed..49fe45486b 100644 --- a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesConnection.java +++ b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesConnection.java @@ -37,11 +37,11 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; -import org.jclouds.blobstore.binders.BindBlobToEntity; +import org.jclouds.blobstore.binders.BindBlobToEntityAndUserMetadataToHeadersWithPrefix; import org.jclouds.blobstore.binders.BindMapToHeadersWithPrefix; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; -import org.jclouds.blobstore.functions.BlobKey; +import org.jclouds.blobstore.functions.BlobName; import org.jclouds.blobstore.functions.ThrowContainerNotFoundOn404; import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404; import org.jclouds.http.functions.ParseETagHeader; @@ -205,7 +205,7 @@ public interface CloudFilesConnection { @ResponseParser(ParseETagHeader.class) Future putObject( @PathParam("container") String container, - @PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindBlobToEntity.class) Blob object); + @PathParam("key") @ParamParser(BlobName.class) @BinderParam(BindBlobToEntityAndUserMetadataToHeadersWithPrefix.class) Blob object); @GET @ResponseParser(ParseObjectFromHeadersAndHttpContent.class) diff --git a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/binders/BindCFObjectAsEntity.java b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/binders/BindCFObjectAsEntity.java index 03cdcdf180..b111e56981 100644 --- a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/binders/BindCFObjectAsEntity.java +++ b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/binders/BindCFObjectAsEntity.java @@ -30,12 +30,12 @@ import javax.inject.Inject; import javax.inject.Named; import javax.ws.rs.core.HttpHeaders; -import org.jclouds.blobstore.binders.BindBlobToEntity; +import org.jclouds.blobstore.binders.BindBlobToEntityAndUserMetadataToHeadersWithPrefix; import org.jclouds.blobstore.domain.Blob; import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpUtils; -public class BindCFObjectAsEntity extends BindBlobToEntity { +public class BindCFObjectAsEntity extends BindBlobToEntityAndUserMetadataToHeadersWithPrefix { @Inject public BindCFObjectAsEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) { super(metadataPrefix); diff --git a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/domain/ContainerCDNMetadata.java b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/domain/ContainerCDNMetadata.java index 4728ba5627..1e1847311b 100644 --- a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/domain/ContainerCDNMetadata.java +++ b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/domain/ContainerCDNMetadata.java @@ -28,7 +28,7 @@ package org.jclouds.rackspace.cloudfiles.domain; * @author James Murty * */ -public class ContainerCDNMetadata extends org.jclouds.blobstore.domain.ContainerMetadata { +public class ContainerCDNMetadata extends org.jclouds.blobstore.internal.ContainerMetadataImpl { private long ttl; private boolean cdn_enabled; diff --git a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/domain/ContainerMetadata.java b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/domain/ContainerMetadata.java index 6c785a99dc..c045e85669 100644 --- a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/domain/ContainerMetadata.java +++ b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/domain/ContainerMetadata.java @@ -28,7 +28,7 @@ package org.jclouds.rackspace.cloudfiles.domain; * @author Adrian Cole * */ -public class ContainerMetadata extends org.jclouds.blobstore.domain.ContainerMetadata { +public class ContainerMetadata extends org.jclouds.blobstore.internal.ContainerMetadataImpl { private long count; private long bytes; diff --git a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/functions/ParseBlobMetadataListFromJsonResponse.java b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/functions/ParseBlobMetadataListFromJsonResponse.java index 51367ea11d..f620f4ac60 100644 --- a/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/functions/ParseBlobMetadataListFromJsonResponse.java +++ b/rackspace/cloudfiles/core/src/main/java/org/jclouds/rackspace/cloudfiles/functions/ParseBlobMetadataListFromJsonResponse.java @@ -27,11 +27,13 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.lang.reflect.Type; +import java.util.Comparator; import java.util.SortedSet; import javax.inject.Inject; import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.blobstore.internal.BlobMetadataImpl; import org.jclouds.http.HttpUtils; import org.jclouds.http.functions.ParseJson; import org.joda.time.DateTime; @@ -76,10 +78,17 @@ public class ParseBlobMetadataListFromJsonResponse extends ParseJson list = gson.fromJson(new InputStreamReader(stream, "UTF-8"), listType); - return Sets.newTreeSet(Iterables.transform(list, + SortedSet returnVal = Sets.newTreeSet(new Comparator() { + + public int compare(BlobMetadata o1, BlobMetadata o2) { + return (o1 == o2) ? 0 : o1.getName().compareTo(o2.getName()); + } + + }); + Iterables.addAll(returnVal, Iterables.transform(list, new Function() { public BlobMetadata apply(CloudFilesMetadata from) { - BlobMetadata metadata = new BlobMetadata(from.name); + BlobMetadata metadata = new BlobMetadataImpl(from.name); metadata.setSize(from.bytes); metadata.setLastModified(from.last_modified); metadata.setContentType(from.content_type); @@ -88,6 +97,7 @@ public class ParseBlobMetadataListFromJsonResponse extends ParseJson object = new Blob("object"); + Blob object = new BlobImpl("object"); object.setData(data); object.setContentLength(data.length()); object.generateMD5(); @@ -296,8 +297,8 @@ public class CloudFilesConnectionLiveTest { } // Test HEAD of object - BlobMetadata metadata = connection.getObjectMetadata(containerName, object.getKey()); - // TODO assertEquals(metadata.getKey(), object.getKey()); + BlobMetadata metadata = connection.getObjectMetadata(containerName, object.getName()); + // TODO assertEquals(metadata.getName(), object.getName()); assertEquals(metadata.getSize(), data.length()); assertEquals(metadata.getContentType(), "text/plain"); assertEquals(HttpUtils.toHexString(md5), HttpUtils.toHexString(object.getMetadata() @@ -310,7 +311,7 @@ public class CloudFilesConnectionLiveTest { Map userMetadata = Maps.newHashMap(); userMetadata.put("New-Metadata-1", "value-1"); userMetadata.put("New-Metadata-2", "value-2"); - assertTrue(connection.setObjectMetadata(containerName, object.getKey(), userMetadata)); + assertTrue(connection.setObjectMetadata(containerName, object.getName(), userMetadata)); // Test GET of missing object try { @@ -319,10 +320,10 @@ public class CloudFilesConnectionLiveTest { } catch (KeyNotFoundException e) { } // Test GET of object (including updated metadata) - Blob getBlob = connection.getObject(containerName, object.getKey()).get(120, + Blob getBlob = connection.getObject(containerName, object.getName()).get(120, TimeUnit.SECONDS); assertEquals(IOUtils.toString((InputStream) getBlob.getData()), data); - // TODO assertEquals(getBlob.getKey(), object.getKey()); + // TODO assertEquals(getBlob.getName(), object.getName()); assertEquals(getBlob.getContentLength(), data.length()); assertEquals(getBlob.getMetadata().getContentType(), "text/plain"); assertEquals(HttpUtils.toHexString(md5), HttpUtils.toHexString(getBlob.getMetadata() @@ -345,7 +346,7 @@ public class CloudFilesConnectionLiveTest { // Test PUT chunked/streamed upload with data of "unknown" length ByteArrayInputStream bais = new ByteArrayInputStream(data.getBytes("UTF-8")); - object = new Blob("chunked-object"); + object = new BlobImpl("chunked-object"); object.setData(bais); newEtag = connection.putObject(containerName, object).get(10, TimeUnit.SECONDS); assertEquals(HttpUtils.toHexString(md5), HttpUtils.toHexString(getBlob.getMetadata() @@ -354,7 +355,7 @@ public class CloudFilesConnectionLiveTest { // Test GET with options // Non-matching ETag try { - connection.getObject(containerName, object.getKey(), + connection.getObject(containerName, object.getName(), GetOptions.Builder.ifETagDoesntMatch(newEtag)).get(120, TimeUnit.SECONDS); } catch (Exception e) { assertEquals(e.getCause().getClass(), HttpResponseException.class); @@ -362,11 +363,12 @@ public class CloudFilesConnectionLiveTest { } // Matching ETag - getBlob = connection.getObject(containerName, object.getKey(), + getBlob = connection.getObject(containerName, object.getName(), GetOptions.Builder.ifETagMatches(newEtag)).get(120, TimeUnit.SECONDS); assertEquals(getBlob.getMetadata().getETag(), newEtag); - getBlob = connection.getObject(containerName, object.getKey(), GetOptions.Builder.startAt(8)) - .get(120, TimeUnit.SECONDS); + getBlob = connection + .getObject(containerName, object.getName(), GetOptions.Builder.startAt(8)).get(120, + TimeUnit.SECONDS); assertEquals(IOUtils.toString((InputStream) getBlob.getData()), data.substring(8)); assertTrue(connection.removeObject(containerName, "object").get(10, TimeUnit.SECONDS)); diff --git a/rackspace/cloudfiles/core/src/test/java/org/jclouds/rackspace/cloudfiles/functions/ParseBlobMetadataListFromJsonResponseTest.java b/rackspace/cloudfiles/core/src/test/java/org/jclouds/rackspace/cloudfiles/functions/ParseBlobMetadataListFromJsonResponseTest.java index 2048f8479b..5f6d33c07d 100644 --- a/rackspace/cloudfiles/core/src/test/java/org/jclouds/rackspace/cloudfiles/functions/ParseBlobMetadataListFromJsonResponseTest.java +++ b/rackspace/cloudfiles/core/src/test/java/org/jclouds/rackspace/cloudfiles/functions/ParseBlobMetadataListFromJsonResponseTest.java @@ -29,6 +29,8 @@ import java.io.InputStream; import java.util.List; import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.blobstore.internal.BlobMetadataImpl; +import org.jclouds.http.HttpUtils; import org.jclouds.http.functions.config.ParserModule; import org.joda.time.DateTime; import org.testng.annotations.Test; @@ -51,14 +53,16 @@ public class ParseBlobMetadataListFromJsonResponseTest { public void testApplyInputStream() { InputStream is = getClass().getResourceAsStream("/test_list_container.json"); List expects = Lists.newArrayList(); - BlobMetadata one = new BlobMetadata("test_obj_1"); + BlobMetadata one = new BlobMetadataImpl("test_obj_1"); one.setETag("4281c348eaf83e70ddce0e07221c3d28"); + one.setContentMD5(HttpUtils.fromHexString(one.getETag())); one.setSize(14); one.setContentType("application/octet-stream"); one.setLastModified(new DateTime("2009-02-03T05:26:32.612278")); expects.add(one); - BlobMetadata two = new BlobMetadata("test_obj_2"); + BlobMetadata two = new BlobMetadataImpl("test_obj_2"); two.setETag("b039efe731ad111bc1b0ef221c3849d0"); + two.setContentMD5(HttpUtils.fromHexString(two.getETag())); two.setSize(64); two.setContentType("application/octet-stream"); two.setLastModified(new DateTime("2009-02-03T05:26:32.612278")); diff --git a/rackspace/cloudfiles/core/src/test/java/org/jclouds/rackspace/cloudfiles/functions/ParseObjectMetadataFromHeadersTest.java b/rackspace/cloudfiles/core/src/test/java/org/jclouds/rackspace/cloudfiles/functions/ParseObjectMetadataFromHeadersTest.java index 03186ae85f..f5571ad6b0 100644 --- a/rackspace/cloudfiles/core/src/test/java/org/jclouds/rackspace/cloudfiles/functions/ParseObjectMetadataFromHeadersTest.java +++ b/rackspace/cloudfiles/core/src/test/java/org/jclouds/rackspace/cloudfiles/functions/ParseObjectMetadataFromHeadersTest.java @@ -29,6 +29,7 @@ import static org.testng.Assert.assertNotNull; import javax.inject.Provider; import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.blobstore.internal.BlobMetadataImpl; import org.jclouds.http.HttpResponse; import org.jclouds.util.DateService; import org.testng.annotations.Test; @@ -45,7 +46,7 @@ public class ParseObjectMetadataFromHeadersTest { public void testEtagCaseIssue() { ParseObjectMetadataFromHeaders parser = new ParseObjectMetadataFromHeaders( createNiceMock(DateService.class), "", createNiceMock(Provider.class)); - BlobMetadata md = new BlobMetadata("hello"); + BlobMetadata md = new BlobMetadataImpl("hello"); HttpResponse response = new HttpResponse(); response.getHeaders().put("Etag", "feb1"); parser.addETagTo(response, md);