blob: f979c2d898101ca5e3cdc1c4c82a8507d4e53d5b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.openstack.swift.v1.domain;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Objects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;
import org.jclouds.io.Payload;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
/**
* Represents an object in OpenStack Object Storage.
*
* @author Adrian Cole
* @author Jeremy Daggett
*
* @see ObjectApi
*/
public class SwiftObject implements Comparable<SwiftObject> {
private final String name;
private final URI uri;
private final String etag;
private final Date lastModified;
private final Multimap<String, String> headers;
private final Map<String, String> metadata;
private final Payload payload;
protected SwiftObject(String name, URI uri, String etag, Date lastModified,
Multimap<String, String> headers, Map<String, String> metadata, Payload payload) {
this.name = checkNotNull(name, "name");
this.uri = checkNotNull(uri, "uri of %s", uri);
this.etag = checkNotNull(etag, "etag of %s", name).replace("\"", "");
this.lastModified = checkNotNull(lastModified, "lastModified of %s", name);
this.headers = headers == null ? ImmutableMultimap.<String, String> of() : checkNotNull(headers, "headers of %s", name);
this.metadata = metadata == null ? ImmutableMap.<String, String> of() : metadata;
this.payload = checkNotNull(payload, "payload of %s", name);
}
/**
* @return The name of this object.
*/
public String getName() {
return name;
}
/**
* @return The {@link URI} for this object.
*/
public URI getUri() {
return uri;
}
/**
* @return The ETag of the content of this object.
* @deprecated Please use {@link #getETag()} as this method will be removed in jclouds 1.8.
*/
public String getEtag() {
return etag;
}
/**
* @return The ETag of the content of this object.
*/
public String getETag() {
return etag;
}
/**
* @return The {@link Date} that this object was last modified.
*/
public Date getLastModified() {
return lastModified;
}
/**
* @return The HTTP headers for this object.
*/
public Multimap<String, String> getHeaders() {
return headers;
}
/**
* <h3>NOTE</h3>
* In current swift implementations, headers keys are lower-cased. This means
* characters such as turkish will probably not work out well.
*
* @return a {@code Map<String, String>} containing this object's metadata. The map is empty
* except in {@link ObjectApi#head(String) GetObjectMetadata} or
* {@link ObjectApi#get(String) GetObject} commands.
*/
public Map<String, String> getMetadata() {
return metadata;
}
/**
* <h3>NOTE</h3>
* The object will only have a {@link Payload#getInput()} when retrieved via the
* {@link ObjectApi#get(String) GetObject} command.
*
* @return The {@link Payload} for this object.
*/
public Payload getPayload() {
return payload;
}
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object instanceof SwiftObject) {
final SwiftObject that = SwiftObject.class.cast(object);
return equal(getName(), that.getName())
&& equal(getUri(), that.getUri())
&& equal(getETag(), that.getETag());
} else {
return false;
}
}
@Override
public int hashCode() {
return Objects.hashCode(getName(), getUri(), getETag());
}
@Override
public String toString() {
return string().toString();
}
protected ToStringHelper string() {
return toStringHelper(this)
.add("name", getName())
.add("uri", getUri())
.add("etag", getETag())
.add("lastModified", getLastModified())
.add("metadata", getMetadata());
}
@Override
public int compareTo(SwiftObject that) {
if (that == null)
return 1;
if (this == that)
return 0;
return this.getName().compareTo(that.getName());
}
public static Builder builder() {
return new Builder();
}
public Builder toBuilder() {
return builder().fromObject(this);
}
public static class Builder {
protected String name;
protected URI uri;
protected String etag;
protected Date lastModified;
protected Payload payload;
protected Multimap<String, String> headers = ImmutableMultimap.of();
protected Map<String, String> metadata = ImmutableMap.of();
/**
* @see SwiftObject#getName()
*/
public Builder name(String name) {
this.name = checkNotNull(name, "name");
return this;
}
/**
* @see SwiftObject#getUri()
*/
public Builder uri(URI uri) {
this.uri = checkNotNull(uri, "uri");
return this;
}
/**
* @see SwiftObject#getETag()
*/
public Builder etag(String etag) {
this.etag = etag;
return this;
}
/**
* @see SwiftObject#getLastModified()
*/
public Builder lastModified(Date lastModified) {
this.lastModified = lastModified;
return this;
}
/**
* @see SwiftObject#getPayload()
*/
public Builder payload(Payload payload) {
this.payload = payload;
return this;
}
/**
* @see SwiftObject#getHeaders()
*/
public Builder headers(Multimap<String, String> headers) {
this.headers = headers;
return this;
}
/**
* Will lower-case all metadata keys due to a swift implementation
* decision.
*
* @see SwiftObject#getMetadata()
*/
public Builder metadata(Map<String, String> metadata) {
ImmutableMap.Builder<String, String> builder = ImmutableMap.<String, String> builder();
for (Entry<String, String> entry : checkNotNull(metadata, "metadata").entrySet()) {
builder.put(entry.getKey().toLowerCase(), entry.getValue());
}
this.metadata = builder.build();
return this;
}
public SwiftObject build() {
return new SwiftObject(name, uri, etag, lastModified, headers, metadata, payload);
}
public Builder fromObject(SwiftObject from) {
return name(from.getName())
.uri(from.getUri())
.etag(from.getETag())
.lastModified(from.getLastModified())
.headers(from.getHeaders())
.metadata(from.getMetadata())
.payload(from.getPayload());
}
}
}