merged cdmi changes and fixed classpath issues

This commit is contained in:
Kenneth Nagin 2012-05-20 14:56:01 +03:00 committed by Adrian Cole
parent 180265fe49
commit 929a9ce044
14 changed files with 1389 additions and 175 deletions

View File

@ -18,7 +18,6 @@
*/
package org.jclouds.snia.cdmi.v1;
/**
* Object Types used in CDMI.
*
@ -26,6 +25,7 @@ package org.jclouds.snia.cdmi.v1;
*/
public interface ObjectTypes {
public static final String CONTAINER = "application/cdmi-container";
public static final String CONTAINER = "application/cdmi-container";
public static final String DATAOBJECT = "application/cdmi-object";
public static final String CDMIOBJECT = "application/cdmi-object";
}

View File

@ -21,10 +21,19 @@ package org.jclouds.snia.cdmi.v1.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.jclouds.domain.JsonBall;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
/**
* The base type for all objects in the CDMI model.
@ -48,6 +57,18 @@ public class CDMIObject {
private String objectID;
private String objectType;
private String objectName;
private String parentURI;
private Map<String, JsonBall> metadata = Maps.newHashMap();
/**
* @see DataObject#getMetadata()
*/
public B metadata(Map<String, JsonBall> metadata) {
this.metadata = ImmutableMap.copyOf(checkNotNull(metadata,
"metadata"));
return self();
}
@SuppressWarnings("unchecked")
protected B self() {
@ -78,24 +99,41 @@ public class CDMIObject {
return self();
}
/**
* @see CDMIObject#getParentURI()
*/
public B parentURI(String parentURI) {
this.parentURI = parentURI;
return self();
}
public CDMIObject build() {
return new CDMIObject(this);
}
protected B fromCDMIObject(CDMIObject in) {
return objectID(in.getObjectID()).objectType(in.getObjectType())
.objectName(in.getObjectName());
.objectName(in.getObjectName())
.parentURI(in.getParentURI()).metadata(in.getMetadata());
}
}
private final String objectID;
private final String objectType;
private final String objectName;
private String parentURI;
private final Map<String, JsonBall> metadata;
private Map<String, String> userMetaDataIn;
private Map<String, String> systemMetaDataIn;
private List<Map<String, String>> aclMetaDataIn;
protected CDMIObject(Builder<?> builder) {
this.objectID = checkNotNull(builder.objectID, "objectID");
this.objectType = checkNotNull(builder.objectType, "objectType");
this.objectName = builder.objectName;
this.parentURI = checkNotNull(builder.parentURI, "parentURI");
this.metadata = ImmutableMap.copyOf(checkNotNull(builder.metadata,
"metadata"));
}
/**
@ -134,6 +172,102 @@ public class CDMIObject {
return (objectName == null) ? "" : objectName;
}
/**
*
* parent URI
*/
public String getParentURI() {
return parentURI;
}
/**
* Metadata for the CDMI object. This field includes any user and system
* metadata specified in the request body metadata field, along with storage
* system metadata generated by the cloud storage system.
*/
public Map<String, JsonBall> getMetadata() {
return metadata;
}
/**
* Parse Metadata for the container object from the original JsonBall.
* System metadata data is prefixed with cdmi. System ACL metadata data is
* prefixed with cdmi_acl
*
*/
private void parseMetadata() {
userMetaDataIn = new HashMap<String, String>();
systemMetaDataIn = new HashMap<String, String>();
aclMetaDataIn = new ArrayList<Map<String, String>>();
Iterator<String> keys = metadata.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
JsonBall value = metadata.get(key);
if (key.startsWith("cdmi")) {
if (key.matches("cdmi_acl")) {
String[] cdmi_acl_array = value.toString().split("[{}]");
for (int i = 0; i < cdmi_acl_array.length; i++) {
if (!(cdmi_acl_array[i].startsWith("[")
|| cdmi_acl_array[i].startsWith("]") || cdmi_acl_array[i]
.startsWith(","))) {
HashMap<String, String> aclMap = new HashMap<String, String>();
String[] cdmi_acl_member = cdmi_acl_array[i]
.split(",");
for (String s : cdmi_acl_member) {
String cdmi_acl_key = s.substring(0,
s.indexOf(":"));
String cdmi_acl_value = s.substring(s
.indexOf(":") + 1);
cdmi_acl_value.replace('"', ' ').trim();
aclMap.put(cdmi_acl_key, cdmi_acl_value);
}
aclMetaDataIn.add(aclMap);
}
}
} else {
systemMetaDataIn.put(key, value.toString()
.replace('"', ' ').trim());
}
} else {
userMetaDataIn.put(key, value.toString().replace('"', ' ')
.trim());
}
}
}
/**
* Get User Metadata for the container object. This field includes any user
* metadata
*/
public Map<String, String> getUserMetadata() {
if (userMetaDataIn == null) {
parseMetadata();
}
return userMetaDataIn;
}
/**
* Get System Metadata for the container object excluding ACL related
* metadata
*/
public Map<String, String> getSystemMetadata() {
if (systemMetaDataIn == null) {
parseMetadata();
}
return systemMetaDataIn;
}
/**
* Get System Metadata for the container object excluding ACL related
* metadata
*/
public List<Map<String, String>> getACLMetadata() {
if (aclMetaDataIn == null) {
parseMetadata();
}
return aclMetaDataIn;
}
@Override
public boolean equals(Object o) {
if (this == o)
@ -143,7 +277,9 @@ public class CDMIObject {
CDMIObject that = CDMIObject.class.cast(o);
return equal(this.objectID, that.objectID)
&& equal(this.objectName, that.objectName)
&& equal(this.objectType, that.objectType);
&& equal(this.objectType, that.objectType)
&& equal(this.parentURI, that.parentURI)
&& equal(this.metadata, that.metadata);
}
public boolean clone(Object o) {
@ -157,7 +293,8 @@ public class CDMIObject {
@Override
public int hashCode() {
return Objects.hashCode(objectID, objectName, objectType);
return Objects.hashCode(objectID, objectName, objectType, parentURI,
metadata);
}
@Override
@ -167,6 +304,7 @@ public class CDMIObject {
protected ToStringHelper string() {
return Objects.toStringHelper("").add("objectID", objectID)
.add("objectName", objectName).add("objectType", objectType);
.add("objectName", objectName).add("objectType", objectType)
.add("parentURI", parentURI).add("metadata", metadata);
}
}

View File

@ -21,20 +21,11 @@ package org.jclouds.snia.cdmi.v1.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jclouds.domain.JsonBall;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
/**
*
@ -55,7 +46,6 @@ public class Container extends CDMIObject {
CDMIObject.Builder<B> {
private Set<String> children = ImmutableSet.of();
private Map<String, JsonBall> metadata = Maps.newHashMap();
/**
* @see Container#getChildren()
@ -74,14 +64,6 @@ public class Container extends CDMIObject {
return self();
}
/**
* @see Container#getMetadata()
*/
public B metadata(Map<String, JsonBall> metadata) {
this.metadata = ImmutableMap.copyOf(checkNotNull(metadata,
"metadata"));
return self();
}
@Override
public Container build() {
@ -89,8 +71,8 @@ public class Container extends CDMIObject {
}
public B fromContainer(Container in) {
return fromCDMIObject(in).children(in.getChildren()).metadata(
in.getMetadata());
return fromCDMIObject(in).children(in.getChildren());
// .metadata(in.getMetadata());
}
}
@ -98,18 +80,11 @@ public class Container extends CDMIObject {
}
private final Set<String> children;
private final Map<String, JsonBall> metadata;
private Map<String, String> userMetaDataIn;
private Map<String, String> systemMetaDataIn;
private List<Map<String, String>> aclMetaDataIn;
protected Container(Builder<?> builder) {
super(builder);
this.children = ImmutableSet.copyOf(checkNotNull(builder.children,
"children"));
this.metadata = ImmutableMap.copyOf(checkNotNull(builder.metadata,
"metadata"));
}
/**
@ -120,93 +95,6 @@ public class Container extends CDMIObject {
return children;
}
/**
* Metadata for the container object. This field includes any user and
* system metadata specified in the request body metadata field, along with
* storage system metadata generated by the cloud storage system.
*/
public Map<String, JsonBall> getMetadata() {
return metadata;
}
/**
* Parse Metadata for the container object from the original JsonBall.
* System metadata data is prefixed with cdmi. System ACL metadata data is
* prefixed with cdmi_acl
*
*/
private void parseMetadata() {
userMetaDataIn = new HashMap<String, String>();
systemMetaDataIn = new HashMap<String, String>();
aclMetaDataIn = new ArrayList<Map<String, String>>();
Iterator<String> keys = metadata.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
JsonBall value = metadata.get(key);
if (key.startsWith("cdmi")) {
if (key.matches("cdmi_acl")) {
String[] cdmi_acl_array = value.toString().split("[{}]");
for (int i = 0; i < cdmi_acl_array.length; i++) {
if (!(cdmi_acl_array[i].startsWith("[")
|| cdmi_acl_array[i].startsWith("]") || cdmi_acl_array[i]
.startsWith(","))) {
HashMap<String, String> aclMap = new HashMap<String, String>();
String[] cdmi_acl_member = cdmi_acl_array[i]
.split(",");
for (String s : cdmi_acl_member) {
String cdmi_acl_key = s.substring(0,
s.indexOf(":"));
String cdmi_acl_value = s.substring(s
.indexOf(":") + 1);
cdmi_acl_value.replace('"', ' ').trim();
aclMap.put(cdmi_acl_key, cdmi_acl_value);
}
aclMetaDataIn.add(aclMap);
}
}
} else {
systemMetaDataIn.put(key, value.toString()
.replace('"', ' ').trim());
}
} else {
userMetaDataIn.put(key, value.toString().replace('"', ' ')
.trim());
}
}
}
/**
* Get User Metadata for the container object. This field includes any user
* metadata
*/
public Map<String, String> getUserMetadata() {
if (userMetaDataIn == null) {
parseMetadata();
}
return userMetaDataIn;
}
/**
* Get System Metadata for the container object excluding ACL related
* metadata
*/
public Map<String, String> getSystemMetadata() {
if (systemMetaDataIn == null) {
parseMetadata();
}
return systemMetaDataIn;
}
/**
* Get System Metadata for the container object excluding ACL related
* metadata
*/
public List<Map<String, String>> getACLMetadata() {
if (aclMetaDataIn == null) {
parseMetadata();
}
return aclMetaDataIn;
}
@Override
public boolean equals(Object o) {
@ -215,19 +103,17 @@ public class Container extends CDMIObject {
if (o == null || getClass() != o.getClass())
return false;
Container that = Container.class.cast(o);
return super.equals(that) && equal(this.children, that.children)
&& equal(this.metadata, that.metadata);
return super.equals(that) && equal(this.children, that.children);
}
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(), children, metadata);
return Objects.hashCode(super.hashCode(), children);
}
@Override
public ToStringHelper string() {
return super.string().add("children", children)
.add("metadata", metadata);
return super.string().add("children", children);
}
}

View File

@ -0,0 +1,198 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.snia.cdmi.v1.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import com.google.common.base.Charsets;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.io.ByteStreams;
import com.google.common.io.Files;
import com.google.common.io.InputSupplier;
/**
*
* @author Kenneth Nagin
*/
public class DataObject extends CDMIObject {
public static Builder<?> builder() {
return new ConcreteBuilder();
}
@Override
public Builder<?> toBuilder() {
return builder().fromDataObject(this);
}
public static class Builder<B extends Builder<B>> extends
CDMIObject.Builder<B> {
private String mimetype = new String();
private String value = new String();
/**
* @see DataObject#getMimetype()
*/
public B mimetype(String mimetype) {
this.mimetype = mimetype;
return self();
}
/**
* @see DataObject#getValueAsString()
*/
public B value(String value) {
this.value = value;
return self();
}
@Override
public DataObject build() {
return new DataObject(this);
}
public B fromDataObject(DataObject in) {
return fromCDMIObject(in).mimetype(in.getMimetype());
}
}
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
}
private final String mimetype;
private final String value;
protected DataObject(Builder<?> builder) {
super(builder);
this.mimetype = checkNotNull(builder.mimetype, "mimetype");
this.value = checkNotNull(builder.value, "value");
}
/**
* get dataObject's mimetype.
*/
public String getMimetype() {
return mimetype;
}
/**
* get dataObject's value as a String
*/
public String getValueAsString() {
return value;
}
/**
* get dataObject's value as a InputStream value character set is
* Charsets.UTF_8
*
* @return value
*/
public InputSupplier<ByteArrayInputStream> getValueAsInputSupplier() {
return ByteStreams.newInputStreamSupplier(value.getBytes(Charsets.UTF_8));
}
/**
* get dataObject's value as a InputStream
*
* @param charset
* value character set
* @return value
*/
public InputSupplier<ByteArrayInputStream> getValueAsInputSupplier(Charset charset) {
return ByteStreams.newInputStreamSupplier(value.getBytes(charset));
}
/**
* get dataObject's value as a ByteArray value character set is
* Charsets.UTF_8
*
* @return value
*/
public byte[] getValueAsByteArray() {
return value.getBytes(Charsets.UTF_8);
}
/**
* get dataObject's value as a InputStream
*
* @param charset
* value character set
* @return value
*/
public byte[] getValueAsByteArray(Charset charset) {
return value.getBytes(charset);
}
/**
* get dataObject's value as a File value character set is Charsets.UTF_8
*
* @param destDir
* destination directory
* @return value
*/
public File getValueAsFile(File destDir) throws IOException {
File fileOut = new File(destDir, this.getObjectName());
Files.copy(getValueAsInputSupplier(), fileOut);
return fileOut;
}
/**
* get dataObject's value as a File
*
* @param charset
* value character set
* @return value
*/
public File getValueAsFile(File destDir, Charset charset)
throws IOException {
File fileOut = new File(destDir, this.getObjectName());
Files.copy(getValueAsInputSupplier(charset), fileOut);
return fileOut;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
DataObject that = DataObject.class.cast(o);
return super.equals(that) && equal(this.mimetype, that.mimetype)
&& equal(this.value, that.value);
}
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(), mimetype, value);
}
@Override
public ToStringHelper string() {
return super.string().add("mimetype", mimetype);
}
}

View File

@ -27,6 +27,8 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.Headers;
import org.jclouds.rest.annotations.RequestFilters;
@ -36,6 +38,7 @@ import org.jclouds.snia.cdmi.v1.ObjectTypes;
import org.jclouds.snia.cdmi.v1.domain.Container;
import org.jclouds.snia.cdmi.v1.filters.BasicAuthenticationAndTenantId;
import org.jclouds.snia.cdmi.v1.filters.StripExtraAcceptHeader;
import org.jclouds.snia.cdmi.v1.options.CreateContainerOptions;
import com.google.common.util.concurrent.ListenableFuture;
@ -68,13 +71,13 @@ public interface ContainerAsyncClient {
@Produces( { ObjectTypes.CONTAINER})
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
@Path("/{containerName}/")
ListenableFuture<Container> createContainer(@PathParam("containerName") String containerName);
ListenableFuture<Container> createContainer(@PathParam("containerName") String containerName,
CreateContainerOptions... options);
/**
* @see ContainerClient#createContainer()
*/
@DELETE
// @Consumes( { ObjectTypes.CONTAINER, MediaType.APPLICATION_JSON })
@Consumes( MediaType.APPLICATION_JSON )
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
@Path("/{containerName}/")

View File

@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout;
import org.jclouds.snia.cdmi.v1.domain.Container;
import org.jclouds.snia.cdmi.v1.options.CreateContainerOptions;
/**
* Container Object Resource Operations
@ -32,7 +33,8 @@ import org.jclouds.snia.cdmi.v1.domain.Container;
*/
@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
public interface ContainerClient {
Container createContainer(String containerName);
Container createContainer(String containerName,
CreateContainerOptions... options);
Container getContainer(String containerName);

View File

@ -18,22 +18,91 @@
*/
package org.jclouds.snia.cdmi.v1.features;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.Headers;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.SkipEncoding;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.snia.cdmi.v1.ObjectTypes;
import org.jclouds.snia.cdmi.v1.domain.DataObject;
import org.jclouds.snia.cdmi.v1.filters.BasicAuthenticationAndTenantId;
import org.jclouds.snia.cdmi.v1.filters.StripExtraAcceptHeader;
import org.jclouds.snia.cdmi.v1.options.CreateDataObjectNonCDMIOptions;
import org.jclouds.snia.cdmi.v1.options.CreateDataObjectOptions;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Data Object Resource Operations
*
* @see DataClient
* @author Adrian Cole
* @author Kenneth Nagin
* @see <a href="http://www.snia.org/cdmi">api doc</a>
*/
@SkipEncoding( { '/', '=' })
@RequestFilters( { BasicAuthenticationAndTenantId.class, StripExtraAcceptHeader.class })
@Headers(keys="X-CDMI-Specification-Version", values = "{jclouds.api-version}")
@SkipEncoding({ '/', '=' })
@RequestFilters({ BasicAuthenticationAndTenantId.class,
StripExtraAcceptHeader.class })
public interface DataAsyncClient {
/**
* @see DataClient#getDataObject()
*/
@Headers(keys = "X-CDMI-Specification-Version", values = "{jclouds.api-version}")
@GET
@Consumes({ ObjectTypes.DATAOBJECT, MediaType.APPLICATION_JSON })
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
@Path("/{containerName}/{dataObjectName}")
ListenableFuture<DataObject> getDataObject(
@PathParam("containerName") String containerName,
@PathParam("dataObjectName") String dataObjectName);
/**
* @see DataClient#createDataObject
*/
@Headers(keys = "X-CDMI-Specification-Version", values = "{jclouds.api-version}")
@PUT
@Consumes({ ObjectTypes.DATAOBJECT, MediaType.APPLICATION_JSON })
@Produces({ ObjectTypes.DATAOBJECT })
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
@Path("/{containerName}/{dataObjectName}")
ListenableFuture<DataObject> createDataObject(
@PathParam("containerName") String containerName,
@PathParam("dataObjectName") String dataObjectName,
CreateDataObjectOptions... options);
/**
* @see DataClient#createDataObjectNonCDMI
*/
@PUT
@Consumes({ "text/plain" })
@Produces({ "text/plain;charset=utf-8" })
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
@Path("/{containerName}/{dataObjectName}")
ListenableFuture<Void> createDataObjectNonCDMI(
@PathParam("containerName") String containerName,
@PathParam("dataObjectName") String dataObjectName,
CreateDataObjectNonCDMIOptions... options);
/**
* @see DataClient#deleteDataObject()
*/
@Headers(keys = "X-CDMI-Specification-Version", values = "{jclouds.api-version}")
@DELETE
@Consumes(MediaType.TEXT_PLAIN)
// note: MediaType.APPLICATION_JSON work also, however without consumes
// jclouds throws null exception
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
@Path("/{containerName}/{dataObjectName}")
ListenableFuture<Void> deleteDataObject(
@PathParam("containerName") String containerName,
@PathParam("dataObjectName") String dataObjectName);
}

View File

@ -19,17 +19,29 @@
package org.jclouds.snia.cdmi.v1.features;
import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout;
import org.jclouds.snia.cdmi.v1.domain.DataObject;
import org.jclouds.snia.cdmi.v1.options.CreateDataObjectNonCDMIOptions;
import org.jclouds.snia.cdmi.v1.options.CreateDataObjectOptions;
/**
* Data Object Resource Operations
*
* @see DataAsyncClient
* @author Adrian Cole
* @author Kenneth Nagin
* @see <a href="http://www.snia.org/cdmi">api doc</a>
*/
@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
public interface DataClient {
DataObject createDataObject(String containerName, String dataObjectName,
CreateDataObjectOptions... options);
void createDataObjectNonCDMI(String containerName, String dataObjectName,
CreateDataObjectNonCDMIOptions... options );
DataObject getDataObject(String containerName, String dataObjectName);
void deleteDataObject(String containerName, String dataObjectName);
}

View File

@ -0,0 +1,39 @@
package org.jclouds.snia.cdmi.v1.options;
import java.util.Map;
import java.util.Map.Entry;
import org.jclouds.http.options.BaseHttpRequestOptions;
/**
* Contains options supported in the REST API for the CREATE container
* operation. <h2>
*
* @author Kenneth Nagin
*/
public class CreateContainerOptions extends BaseHttpRequestOptions {
/**
* A name-value pair to associate with the container as metadata.
*/
public CreateContainerOptions withMetadata(Map<String, String> metadata) {
String s = "{ \"metadata\" : {\"key1\" : \"value1\",\"key2\" : \"value2\"} }";
this.payload = s;
String payload = "{ \"metadata\" : {";
String separator = " ";
for (Entry<String, String> entry : metadata.entrySet()) {
payload = payload + separator + "\"" + entry.getKey() + "\" : \""
+ entry.getValue() + "\"";
separator = ",";
}
this.payload = payload + "} }";
return this;
}
public static class Builder {
public static CreateContainerOptions withMetadata(
Map<String, String> metadata) {
CreateContainerOptions options = new CreateContainerOptions();
return (CreateContainerOptions) options.withMetadata(metadata);
}
}
}

View File

@ -0,0 +1,32 @@
package org.jclouds.snia.cdmi.v1.options;
import org.jclouds.http.options.BaseHttpRequestOptions;
/**
* Contains options supported in the REST API for the CREATE container
* operation. <h2>
*
* @author Kenneth Nagin
*/
public class CreateDataObjectNonCDMIOptions extends BaseHttpRequestOptions {
/**
* A name-value pair to associate with the container as metadata.
*/
public CreateDataObjectNonCDMIOptions withStringPayload(String value) {
this.payload = value;
return this;
}
public static class Builder {
public static CreateDataObjectNonCDMIOptions withStringPayload(
String value) {
CreateDataObjectNonCDMIOptions options = new CreateDataObjectNonCDMIOptions();
return (CreateDataObjectNonCDMIOptions) options.withStringPayload(value);
}
}
}

View File

@ -0,0 +1,223 @@
package org.jclouds.snia.cdmi.v1.options;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import org.jclouds.http.options.BaseHttpRequestOptions;
import com.google.common.base.Charsets;
import java.nio.charset.Charset;
import com.google.gson.JsonObject;
import com.google.common.io.CharStreams;
import com.google.common.io.Files;
/**
* CreateDataObjectOptions options supported in the REST API for the CREATE CDMI
* Data Object operation. <h2>
*
* @author Kenneth Nagin
*/
public class CreateDataObjectOptions extends BaseHttpRequestOptions {
private JsonObject jsonObjectBody = new JsonObject();
public CreateDataObjectOptions() {
jsonObjectBody.addProperty("value", new String());
}
/**
* Create CDMI data object with metadata
*
* @param metadata
* @return this
*/
public CreateDataObjectOptions metadata(Map<String, String> metadata) {
JsonObject jsonObjectMetadata = new JsonObject();
if (metadata != null) {
for (Entry<String, String> entry : metadata.entrySet()) {
jsonObjectMetadata
.addProperty(entry.getKey(), entry.getValue());
}
}
jsonObjectBody.add("metadata", jsonObjectMetadata);
this.payload = jsonObjectBody.toString();
return this;
}
/**
* Create CDMI data object with mimetype
*
* @param mimetype
* @return
*/
public CreateDataObjectOptions mimetype(String mimetype) {
jsonObjectBody.addProperty("mimetype", mimetype);
this.payload = jsonObjectBody.toString();
return this;
}
/**
* Create CDMI data object with value equal to empty string
*
* @return
*/
public CreateDataObjectOptions value() {
this.payload = jsonObjectBody.toString();
return this;
}
/**
* Create CDMI data object with String value
*
* @param value
* String value
* @return
*/
public CreateDataObjectOptions value(String value) {
jsonObjectBody.addProperty("value", (value == null) ? new String()
: value);
this.payload = jsonObjectBody.toString();
return this;
}
/**
* Create CDMI data object with byte array value
*
* @param value
* byte array value byte array is converted to a String value
* @return
*/
public CreateDataObjectOptions value(byte[] value) throws IOException {
jsonObjectBody.addProperty("value",
(value == null) ? new String() : new DataInputStream(
new ByteArrayInputStream(value)).readUTF());
this.payload = jsonObjectBody.toString();
return this;
}
/**
* Create CDMI data object with file value
*
* @param value
* File File is converted to a String value with charset UTF_8
* @return
*/
public CreateDataObjectOptions value(File value) throws IOException {
jsonObjectBody.addProperty("value", (value == null) ? new String()
: Files.toString(value, Charsets.UTF_8));
this.payload = jsonObjectBody.toString();
return this;
}
/**
* Create CDMI data object with file value
*
* @param value
* File
* @param charset
* character set of file File is converted to a String value
* @return
*/
public CreateDataObjectOptions value(File value, Charset charset)
throws IOException {
jsonObjectBody.addProperty("value", (value == null) ? new String()
: Files.toString(value, charset));
this.payload = jsonObjectBody.toString();
return this;
}
/**
* Create CDMI data object with InputStream value
*
* @param value
* InputSteam InputSteam is converted to a String value with
* charset UTF_8
* @return
*/
public CreateDataObjectOptions value(InputStream value) throws IOException {
jsonObjectBody
.addProperty(
"value",
(value == null) ? new String() : CharStreams
.toString(new InputStreamReader(value,
Charsets.UTF_8)));
this.payload = jsonObjectBody.toString();
return this;
}
/**
* Create CDMI data object with InputStream value
*
* @param value
* InputSteam
* @param charset
* character set of input stream InputSteam is converted to a
* String value with charset UTF_8
* @return
*/
public CreateDataObjectOptions value(InputStream value, Charset charset)
throws IOException {
jsonObjectBody.addProperty("value", (value == null) ? new String()
: CharStreams.toString(new InputStreamReader(value, charset)));
this.payload = jsonObjectBody.toString();
return this;
}
public static class Builder {
public static CreateDataObjectOptions metadata(
Map<String, String> metadata) {
CreateDataObjectOptions options = new CreateDataObjectOptions();
return (CreateDataObjectOptions) options.metadata(metadata);
}
public static CreateDataObjectOptions mimetype(String mimetype) {
CreateDataObjectOptions options = new CreateDataObjectOptions();
return (CreateDataObjectOptions) options.mimetype(mimetype);
}
public static CreateDataObjectOptions value() {
CreateDataObjectOptions options = new CreateDataObjectOptions();
return (CreateDataObjectOptions) options.value();
}
public static CreateDataObjectOptions value(String value) {
CreateDataObjectOptions options = new CreateDataObjectOptions();
return (CreateDataObjectOptions) options.value(value);
}
public static CreateDataObjectOptions value(byte[] value)
throws IOException {
CreateDataObjectOptions options = new CreateDataObjectOptions();
return (CreateDataObjectOptions) options.value(value);
}
public static CreateDataObjectOptions value(File value)
throws IOException {
CreateDataObjectOptions options = new CreateDataObjectOptions();
return (CreateDataObjectOptions) options.value(value);
}
public static CreateDataObjectOptions value(File value, Charset charset)
throws IOException {
CreateDataObjectOptions options = new CreateDataObjectOptions();
return (CreateDataObjectOptions) options.value(value, charset);
}
public static CreateDataObjectOptions value(InputStream value)
throws IOException {
CreateDataObjectOptions options = new CreateDataObjectOptions();
return (CreateDataObjectOptions) options.value(value);
}
public static CreateDataObjectOptions value(InputStream value,
Charset charset) throws IOException {
CreateDataObjectOptions options = new CreateDataObjectOptions();
return (CreateDataObjectOptions) options.value(value, charset);
}
}
}

View File

@ -21,60 +21,92 @@ package org.jclouds.snia.cdmi.v1.features;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.jclouds.domain.JsonBall;
import org.jclouds.snia.cdmi.v1.ObjectTypes;
import org.jclouds.snia.cdmi.v1.domain.Container;
import org.jclouds.snia.cdmi.v1.internal.BaseCDMIClientLiveTest;
import org.jclouds.snia.cdmi.v1.options.CreateContainerOptions;
import org.testng.annotations.Test;
/**
*
* @author Kenneth Nagin
*/
@Test(groups = "live", testName = "ContainerClientLiveTest")
public class ContainerClientLiveTest extends BaseCDMIClientLiveTest {
@Test
public void testCreateContainer() throws Exception {
String pContainerName = "MyContainer" + System.currentTimeMillis();
ContainerClient client = cdmiContext.getApi().getContainerClient();
Logger.getAnonymousLogger().info("createContainer: " + pContainerName);
Container container = client.createContainer(pContainerName);
assertNotNull(container);
System.out.println(container);
Logger.getAnonymousLogger().info("getContainer: " + pContainerName);
container = client.getContainer(pContainerName);
assertNotNull(container);
System.out.println(container);
assertEquals(container.getObjectType(), ObjectTypes.CONTAINER);
assertNotNull(container.getObjectID());
assertNotNull(container.getObjectName());
assertEquals(container.getObjectName(), pContainerName + "/");
assertNotNull(container.getChildren());
assertEquals(container.getChildren().isEmpty(), true);
System.out.println("Children: " + container.getChildren());
assertNotNull(container.getMetadata());
assertNotNull(container.getUserMetadata());
System.out.println("UserMetaData: " + container.getUserMetadata());
assertNotNull(container.getSystemMetadata());
System.out.println("SystemMetaData: " + container.getSystemMetadata());
assertNotNull(container.getACLMetadata());
List<Map<String, String>> aclMetadataOut = container.getACLMetadata();
System.out.println("ACLMetaData: ");
for (Map<String, String> aclMap : aclMetadataOut) {
System.out.println(aclMap);
}
container = client.getContainer("/");
System.out.println("root container: " + container);
assertEquals(container.getChildren().contains(pContainerName + "/"), true);
Logger.getAnonymousLogger().info("deleteContainer: " + pContainerName);
client.deleteContainer(pContainerName);
container = client.getContainer("/");
System.out.println("root container: " + container);
assertEquals(container.getChildren().contains(pContainerName + "/"), false);
}
@Test
public void testCreateContainer() throws Exception {
String pContainerName = "MyContainer" + System.currentTimeMillis();
Map<String, String> pContainerMetaDataIn = new HashMap<String, String>();
Iterator<String> keys;
pContainerMetaDataIn.put("containerkey1", "value1");
pContainerMetaDataIn.put("containerkey2", "value2");
pContainerMetaDataIn.put("containerkey3", "value3");
CreateContainerOptions pCreateContainerOptions = CreateContainerOptions.Builder
.withMetadata(pContainerMetaDataIn);
ContainerClient client = cdmiContext.getApi().getContainerClient();
Logger.getAnonymousLogger().info("createContainer: " + pContainerName);
Container container = client.createContainer(pContainerName,
pCreateContainerOptions);
assertNotNull(container);
System.out.println(container);
Logger.getAnonymousLogger().info("getContainer: " + pContainerName);
container = client.getContainer(pContainerName);
assertNotNull(container);
System.out.println(container);
assertEquals(container.getObjectType(), ObjectTypes.CONTAINER);
assertNotNull(container.getObjectID());
assertNotNull(container.getObjectName());
assertEquals(container.getObjectName(), pContainerName + "/");
assertEquals(container.getParentURI(), "/");
assertNotNull(container.getChildren());
assertEquals(container.getChildren().isEmpty(), true);
System.out.println("Children: " + container.getChildren());
assertNotNull(container.getMetadata());
System.out.println("Raw metadata: " + container.getMetadata());
keys = container.getMetadata().keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
JsonBall value = container.getMetadata().get(key);
System.out.println(key + ":" + value);
}
assertNotNull(container.getUserMetadata());
Map<String, String> pContainerMetaDataOut = container.getUserMetadata();
keys = pContainerMetaDataIn.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
assertEquals(pContainerMetaDataOut.containsKey(key), true);
assertEquals(pContainerMetaDataOut.get(key),
pContainerMetaDataIn.get(key));
}
System.out.println("UserMetaData: " + container.getUserMetadata());
assertNotNull(container.getSystemMetadata());
System.out.println("SystemMetaData: " + container.getSystemMetadata());
assertNotNull(container.getACLMetadata());
List<Map<String, String>> aclMetadataOut = container.getACLMetadata();
System.out.println("ACLMetaData: ");
for (Map<String, String> aclMap : aclMetadataOut) {
System.out.println(aclMap);
}
container = client.getContainer("/");
System.out.println("root container: " + container);
assertEquals(container.getChildren().contains(pContainerName + "/"),
true);
Logger.getAnonymousLogger().info("deleteContainer: " + pContainerName);
client.deleteContainer(pContainerName);
container = client.getContainer("/");
System.out.println("root container: " + container);
assertEquals(container.getChildren().contains(pContainerName + "/"),
false);
}
}

View File

@ -18,13 +18,592 @@
*/
package org.jclouds.snia.cdmi.v1.features;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.logging.Logger;
import org.jclouds.snia.cdmi.v1.domain.Container;
import org.jclouds.snia.cdmi.v1.domain.DataObject;
import org.jclouds.snia.cdmi.v1.internal.BaseCDMIClientLiveTest;
import org.jclouds.snia.cdmi.v1.options.CreateContainerOptions;
import org.jclouds.snia.cdmi.v1.options.CreateDataObjectNonCDMIOptions;
import org.jclouds.snia.cdmi.v1.options.CreateDataObjectOptions;
import org.testng.annotations.Test;
import com.google.common.base.Charsets;
import com.google.common.io.CharStreams;
import com.google.common.io.Files;
/**
* @author Adrian Cole
* @author Kenneth Nagin
*/
@Test(groups = "live", testName = "DataClientLiveTest")
public class DataClientLiveTest extends BaseCDMIClientLiveTest {
@Test
public void testCreateDataObjects() throws Exception {
String containerName = "MyContainer" + System.currentTimeMillis();
String dataObjectNameIn = "dataobject1.txt";
File tmpFileIn = new File("temp.txt");
String value;
InputStream is;
File tmpFileOut;
Files.touch(tmpFileIn);
CreateDataObjectOptions pCreateDataObjectOptions;
DataObject dataObject;
Iterator<String> keys;
Map<String, String> dataObjectMetaDataOut;
Map<String, String> pContainerMetaDataIn = new HashMap<String, String>();
Map<String, String> pDataObjectMetaDataIn = new LinkedHashMap<String, String>();
pDataObjectMetaDataIn.put("dataObjectkey1", "value1");
pDataObjectMetaDataIn.put("dataObjectkey2", "value2");
pDataObjectMetaDataIn.put("dataObjectkey3", "value3");
CreateContainerOptions pCreateContainerOptions = CreateContainerOptions.Builder
.withMetadata(pContainerMetaDataIn);
ContainerClient containerClient = cdmiContext.getApi()
.getContainerClient();
DataClient dataClient = cdmiContext.getApi().getDataClient();
Logger.getAnonymousLogger().info("createContainer: " + containerName);
Container container = containerClient.createContainer(containerName,
pCreateContainerOptions);
try {
assertNotNull(container);
System.out.println(container);
container = containerClient.getContainer(containerName);
assertNotNull(container);
assertNotNull(container.getChildren());
assertEquals(container.getChildren().isEmpty(), true);
// exercise create data object with none cdmi put
value = "Hello CDMI World1";
CreateDataObjectNonCDMIOptions pCreateDataObjectNoneCDMIOptions = CreateDataObjectNonCDMIOptions.Builder
.withStringPayload(value);
dataClient.createDataObjectNonCDMI(containerName, dataObjectNameIn,
pCreateDataObjectNoneCDMIOptions);
System.out.println(containerClient.getContainer(containerName));
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), value);
assertEquals(dataObject.getUserMetadata().isEmpty(), true);
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with value mimetype and metadata
value = "Hello CDMI World2";
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.value(value).mimetype("text/plain")
.metadata(pDataObjectMetaDataIn);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getMimetype(), "text/plain");
assertEquals(dataObject.getValueAsString(), value);
dataObjectMetaDataOut = dataObject.getUserMetadata();
assertNotNull(dataObjectMetaDataOut);
keys = pDataObjectMetaDataIn.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
assertEquals(dataObjectMetaDataOut.containsKey(key), true);
assertEquals(dataObjectMetaDataOut.get(key),
pDataObjectMetaDataIn.get(key));
}
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// verify that options order does not matter
value = "Hello CDMI World3";
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.metadata(pDataObjectMetaDataIn).mimetype("text/plain")
.value(value);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getMimetype(), "text/plain");
assertEquals(dataObject.getValueAsString(), value);
dataObjectMetaDataOut = dataObject.getUserMetadata();
assertNotNull(dataObjectMetaDataOut);
keys = pDataObjectMetaDataIn.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
assertEquals(dataObjectMetaDataOut.containsKey(key), true);
assertEquals(dataObjectMetaDataOut.get(key),
pDataObjectMetaDataIn.get(key));
}
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with empty metadata
value = "Hello CDMI World4";
pDataObjectMetaDataIn.clear();
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.value(value).mimetype("text/plain")
.metadata(pDataObjectMetaDataIn);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getMimetype(), "text/plain");
assertEquals(dataObject.getValueAsString(), value);
dataObjectMetaDataOut = dataObject.getUserMetadata();
assertNotNull(dataObjectMetaDataOut);
assertEquals(true, dataObjectMetaDataOut.isEmpty());
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with null metadata
value = "Hello CDMI World5";
pCreateDataObjectOptions = CreateDataObjectOptions.Builder.value(
value).mimetype("text/plain");
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getMimetype(), "text/plain");
assertEquals(dataObject.getValueAsString(), value);
dataObjectMetaDataOut = dataObject.getUserMetadata();
assertNotNull(dataObjectMetaDataOut);
assertEquals(true, dataObjectMetaDataOut.isEmpty());
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with only value
value = "Hello CDMI World6";
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.value(value);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), value);
dataObjectMetaDataOut = dataObject.getUserMetadata();
assertNotNull(dataObjectMetaDataOut);
assertEquals(true, dataObjectMetaDataOut.isEmpty());
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with empty mimetype only
value = "";
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.mimetype(new String());
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getMimetype(), "");
assertEquals(dataObject.getValueAsString(), "");
dataObjectMetaDataOut = dataObject.getUserMetadata();
assertNotNull(dataObjectMetaDataOut);
assertEquals(true, dataObjectMetaDataOut.isEmpty());
dataClient.deleteDataObject(containerName, dataObjectNameIn);
// exercise create data object with no value
value = "";
pCreateDataObjectOptions = CreateDataObjectOptions.Builder.value();
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), "");
dataObjectMetaDataOut = dataObject.getUserMetadata();
assertNotNull(dataObjectMetaDataOut);
assertEquals(true, dataObjectMetaDataOut.isEmpty());
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with byte array
value = "Hello CDMI World 7";
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(bos);
out.writeUTF(value);
out.close();
byte[] bytes = bos.toByteArray();
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.value(bytes);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), value);
assertEquals(new String(dataObject.getValueAsByteArray()), value);
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with an existing file
File inFile = new File(System.getProperty("user.dir")
+ "/src/test/resources/container.json");
assertEquals(true, inFile.isFile());
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.value(inFile);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
tmpFileOut = dataObject.getValueAsFile(Files.createTempDir());
assertEquals(true, Files.equal(tmpFileOut, inFile));
tmpFileOut.delete();
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")),
Files.toString(inFile, Charsets.UTF_8).length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with a temporary file that we create
// on the fly
// with default Charset
value = "Hello CDMI World 10";
Files.write(value, tmpFileIn, Charsets.UTF_8);
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.value(tmpFileIn);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), value);
tmpFileOut = dataObject.getValueAsFile(Files.createTempDir());
assertEquals(true, Files.equal(tmpFileOut, tmpFileIn));
tmpFileOut.delete();
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with a temporary file that we create
// on the fly
// specify charset UTF_8
Files.write(value, tmpFileIn, Charsets.UTF_8);
pCreateDataObjectOptions = CreateDataObjectOptions.Builder.value(
tmpFileIn, Charsets.UTF_8);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), value);
tmpFileOut = dataObject.getValueAsFile(Files.createTempDir());
assertEquals(true, Files.equal(tmpFileOut, tmpFileIn));
tmpFileOut.delete();
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with a temporary file that we create
// on the fly
// specify charset US_ASCII
Files.write(value, tmpFileIn, Charsets.US_ASCII);
pCreateDataObjectOptions = CreateDataObjectOptions.Builder.value(
tmpFileIn, Charsets.US_ASCII);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), value);
tmpFileOut = dataObject.getValueAsFile(Files.createTempDir());
assertEquals(true, Files.equal(tmpFileOut, tmpFileIn));
tmpFileOut.delete();
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with a temporary file with multiple
// lines
// with default Charset
Files.write("line1", tmpFileIn, Charsets.UTF_8);
Files.append("\nline2", tmpFileIn, Charsets.UTF_8);
Files.append("\nline3", tmpFileIn, Charsets.UTF_8);
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.value(tmpFileIn);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), "line1\nline2\nline3");
tmpFileOut = dataObject.getValueAsFile(Files.createTempDir());
assertEquals(true, Files.equal(tmpFileOut, tmpFileIn));
tmpFileOut.delete();
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")),
Files.toString(tmpFileIn, Charsets.UTF_8).length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with a temporary file with multiple
// lines
// with Charset UTF_8
Files.write("line1", tmpFileIn, Charsets.UTF_8);
Files.append("\nline2", tmpFileIn, Charsets.UTF_8);
Files.append("\nline3", tmpFileIn, Charsets.UTF_8);
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.value(new FileInputStream(tmpFileIn));
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), "line1\nline2\nline3");
tmpFileOut = dataObject.getValueAsFile(Files.createTempDir());
assertEquals(true, Files.equal(tmpFileOut, tmpFileIn));
tmpFileOut.delete();
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")),
Files.toString(tmpFileIn, Charsets.UTF_8).length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with a temporary file with multiple
// lines
// with Charset ISO_8859_1
Files.write("line1", tmpFileIn, Charsets.ISO_8859_1);
Files.append("\nline2", tmpFileIn, Charsets.ISO_8859_1);
Files.append("\nline3", tmpFileIn, Charsets.ISO_8859_1);
pCreateDataObjectOptions = CreateDataObjectOptions.Builder.value(
new FileInputStream(tmpFileIn), Charsets.ISO_8859_1);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), "line1\nline2\nline3");
tmpFileOut = dataObject.getValueAsFile(Files.createTempDir());
assertEquals(true, Files.equal(tmpFileOut, tmpFileIn));
tmpFileOut.delete();
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")),
Files.toString(tmpFileIn, Charsets.ISO_8859_1).length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
// exercise create data object with an inputstream
is = new ByteArrayInputStream(value.getBytes());
pCreateDataObjectOptions = CreateDataObjectOptions.Builder
.value(is);
dataObject = dataClient.createDataObject(containerName,
dataObjectNameIn, pCreateDataObjectOptions);
assertNotNull(dataObject);
dataObject = dataClient.getDataObject(containerName,
dataObjectNameIn);
assertNotNull(dataObject);
System.out.println(dataObject);
System.out.println("value: " + dataObject.getValueAsString());
assertEquals(dataObject.getValueAsString(), value);
assertNotNull(dataObject.getValueAsInputSupplier());
assertEquals(CharStreams.toString(CharStreams.newReaderSupplier(dataObject
.getValueAsInputSupplier(Charsets.UTF_8),Charsets.UTF_8)), value);
assertEquals(
Integer.parseInt(dataObject.getSystemMetadata().get(
"cdmi_size")), value.length());
assertEquals(dataObject.getObjectName(), dataObjectNameIn);
assertEquals(dataObject.getObjectType(), "application/cdmi-object");
assertEquals(dataObject.getParentURI(), "/" + containerName + "/");
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), true);
dataClient.deleteDataObject(containerName, dataObjectNameIn);
assertEquals(containerClient.getContainer(containerName)
.getChildren().contains(dataObjectNameIn), false);
} finally {
tmpFileIn.delete();
containerClient.deleteContainer(containerName);
}
}
}

View File

@ -48,6 +48,7 @@ public class ParseContainerTest extends BaseItemParserTest<Container> {
.objectType("application/cdmi-container")
.objectID("00007E7F00102E230ED82694DAA975D2")
.objectName("MyContainer/")
.parentURI("/")
.metadata(ImmutableMap.<String, JsonBall>builder()
.put("cdmi_size", new JsonBall("\"83\""))
.build())