openstack: adjusting beans in openstack-quantum, openstack-glance and openstack-swift to use ConstructorProperties and Named annotations

This commit is contained in:
Adam Lowe 2012-07-01 20:38:12 +01:00
parent 294e405593
commit 908e164698
13 changed files with 356 additions and 381 deletions

View File

@ -108,21 +108,10 @@ public class Resource implements Comparable<Resource> {
@ConstructorProperties({ @ConstructorProperties({
"id", "name", "links" "id", "name", "links"
}) })
protected Resource(String id, @Nullable String name, Set<Link> links) { protected Resource(String id, @Nullable String name, @Nullable Set<Link> links) {
this.id = checkNotNull(id, "id"); this.id = checkNotNull(id, "id");
this.name = name; this.name = name;
this.links = ImmutableSet.copyOf(checkNotNull(links, "links")); this.links = links == null ? ImmutableSet.<Link>of() : ImmutableSet.copyOf(checkNotNull(links, "links"));
}
// leaving till beans in other openstack projects are updated
@Deprecated
protected Resource(Builder<?> builder) {
this(builder.id, builder.name, builder.links);
}
@Deprecated
protected Resource() {
id = null; name = null; links = ImmutableSet.of();
} }
/** /**

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to jclouds, Inc. (jclouds) under one or more * Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file * contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -18,20 +18,30 @@
*/ */
package org.jclouds.openstack.glance.v1_0.domain; package org.jclouds.openstack.glance.v1_0.domain;
import java.beans.ConstructorProperties;
import java.util.Set;
import javax.inject.Named;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.openstack.v2_0.domain.Link;
import org.jclouds.openstack.v2_0.domain.Resource; import org.jclouds.openstack.v2_0.domain.Resource;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.gson.annotations.SerializedName;
/** /**
* An image the Glance server knows about * An image the Glance server knows about
* *
* @author Adrian Cole * @author Adrian Cole
* @see <a href= "http://glance.openstack.org/glanceapi.html" /> * @see <a href= "http://glance.openstack.org/glanceapi.html" />
* @see <a href= "https://github.com/openstack/glance/blob/master/glance/api/v1/images.py" /> * @see <a href= "https://github.com/openstack/glance/blob/master/glance/api/v1/images.py" />
*/ */
public class Image extends Resource { public class Image extends Resource {
/**
*/
public static enum Status { public static enum Status {
UNRECOGNIZED, ACTIVE, SAVING, QUEUED, KILLED, PENDING_DELETE, DELETED; UNRECOGNIZED, ACTIVE, SAVING, QUEUED, KILLED, PENDING_DELETE, DELETED;
@ -49,7 +59,7 @@ public class Image extends Resource {
} }
} }
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
@ -58,16 +68,16 @@ public class Image extends Resource {
return new ConcreteBuilder().fromImage(this); return new ConcreteBuilder().fromImage(this);
} }
public static abstract class Builder<T extends Builder<T>> extends Resource.Builder<T> { public static abstract class Builder<T extends Builder<T>> extends Resource.Builder<T> {
private Optional<ContainerFormat> containerFormat = Optional.absent(); protected ContainerFormat containerFormat;
private Optional<DiskFormat> diskFormat = Optional.absent(); protected DiskFormat diskFormat;
private Optional<Long> size = Optional.absent(); protected Long size;
private Optional<String> checksum = Optional.absent(); protected String checksum;
/** /**
* @see Image#getContainerFormat() * @see Image#getContainerFormat()
*/ */
public T containerFormat(Optional<ContainerFormat> containerFormat) { public T containerFormat(ContainerFormat containerFormat) {
this.containerFormat = containerFormat; this.containerFormat = containerFormat;
return self(); return self();
} }
@ -75,7 +85,7 @@ public class Image extends Resource {
/** /**
* @see Image#getDiskFormat() * @see Image#getDiskFormat()
*/ */
public T diskFormat(Optional<DiskFormat> diskFormat) { public T diskFormat(DiskFormat diskFormat) {
this.diskFormat = diskFormat; this.diskFormat = diskFormat;
return self(); return self();
} }
@ -83,56 +93,30 @@ public class Image extends Resource {
/** /**
* @see Image#getSize() * @see Image#getSize()
*/ */
public T size(Optional<Long> size) { public T size(Long size) {
this.size = size; this.size = size;
return self(); return self();
} }
/** /**
* @see Image#getSize() * @see Image#getChecksum()
*/ */
public T checksum(Optional<String> checksum) { public T checksum(String checksum) {
this.checksum = checksum; this.checksum = checksum;
return self(); return self();
} }
/**
* @see Image#getContainerFormat()
*/
public T containerFormat(ContainerFormat containerFormat) {
return containerFormat(Optional.of(containerFormat));
}
/**
* @see Image#getDiskFormat()
*/
public T diskFormat(DiskFormat diskFormat) {
return diskFormat(Optional.of(diskFormat));
}
/**
* @see Image#getSize()
*/
public T size(long size) {
return size(Optional.of(size));
}
/**
* @see Image#getSize()
*/
public T checksum(String checksum) {
return checksum(Optional.of(checksum));
}
public Image build() { public Image build() {
return new Image(this); return new Image(id, name, links, containerFormat, diskFormat, size, checksum);
} }
public T fromImage(Image in) { public T fromImage(Image in) {
return super.fromResource(in).containerFormat(in.getContainerFormat()).diskFormat(in.getDiskFormat()).size( return super.fromResource(in)
in.getSize()).checksum(in.getChecksum()); .containerFormat(in.getContainerFormat().orNull())
.diskFormat(in.getDiskFormat().orNull())
.size(in.getSize().orNull())
.checksum(in.getChecksum().orNull());
} }
} }
private static class ConcreteBuilder extends Builder<ConcreteBuilder> { private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
@ -142,29 +126,23 @@ public class Image extends Resource {
} }
} }
protected Image() { @Named("container_format")
// we want serializers like Gson to work w/o using sun.misc.Unsafe, private final Optional<ContainerFormat> containerFormat;
// prohibited in GAE. This also implies fields are not final. @Named("disk_format")
// see http://code.google.com/p/jclouds/issues/detail?id=925 private final Optional<DiskFormat> diskFormat;
} private final Optional<Long> size;
private final Optional<String> checksum;
// | container_format | varchar(20) | YES | | NULL | | @ConstructorProperties({
@SerializedName("container_format") "id", "name", "links", "container_format", "disk_format", "size", "checksum"
private Optional<ContainerFormat> containerFormat = Optional.absent(); })
// | disk_format | varchar(20) | YES | | NULL | | protected Image(String id, @Nullable String name, Set<Link> links, @Nullable ContainerFormat containerFormat,
@SerializedName("disk_format") @Nullable DiskFormat diskFormat, @Nullable Long size, @Nullable String checksum) {
private Optional<DiskFormat> diskFormat = Optional.absent(); super(id, name, links);
// | size | bigint(20) | YES | | NULL | | this.containerFormat = Optional.fromNullable(containerFormat);
private Optional<Long> size = Optional.absent(); this.diskFormat = Optional.fromNullable(diskFormat);
// | checksum | varchar(32) | YES | | NULL | | this.size = Optional.fromNullable(size);
private Optional<String> checksum = Optional.absent(); this.checksum = Optional.fromNullable(checksum);
protected Image(Builder<?> builder) {
super(builder);
this.containerFormat = builder.containerFormat;
this.diskFormat = builder.diskFormat;
this.size = builder.size;
this.checksum = builder.checksum;
} }
public Optional<ContainerFormat> getContainerFormat() { public Optional<ContainerFormat> getContainerFormat() {
@ -180,12 +158,28 @@ public class Image extends Resource {
} }
public Optional<String> getChecksum() { public Optional<String> getChecksum() {
return checksum; return this.checksum;
} }
@Override @Override
protected Objects.ToStringHelper string() { public int hashCode() {
return super.string().add("containerFormat", containerFormat).add("diskFormat", diskFormat).add("size", size) return Objects.hashCode(containerFormat, diskFormat, size, checksum);
.add("checksum", checksum);
} }
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Image that = Image.class.cast(obj);
return super.equals(that) && Objects.equal(this.containerFormat, that.containerFormat)
&& Objects.equal(this.diskFormat, that.diskFormat)
&& Objects.equal(this.size, that.size)
&& Objects.equal(this.checksum, that.checksum);
}
protected ToStringHelper string() {
return super.string()
.add("containerFormat", containerFormat).add("diskFormat", diskFormat).add("size", size).add("checksum", checksum);
}
}

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to jclouds, Inc. (jclouds) under one or more * Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file * contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -20,19 +20,24 @@ package org.jclouds.openstack.glance.v1_0.domain;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.beans.ConstructorProperties;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.Set;
import com.google.common.base.Optional; import javax.inject.Named;
import com.google.common.base.Predicates;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.openstack.v2_0.domain.Link;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper; import com.google.common.base.Objects.ToStringHelper;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.gson.annotations.SerializedName;
/** /**
* Detailed listing of an Image * Detailed listing of an Image
* *
* @author Adrian Cole * @author Adrian Cole
* @see <a href= "http://glance.openstack.org/glanceapi.html" /> * @see <a href= "http://glance.openstack.org/glanceapi.html" />
* @see <a href= "https://github.com/openstack/glance/blob/master/glance/api/v1/images.py" /> * @see <a href= "https://github.com/openstack/glance/blob/master/glance/api/v1/images.py" />
@ -48,17 +53,17 @@ public class ImageDetails extends Image {
return new ConcreteBuilder().fromImageDetails(this); return new ConcreteBuilder().fromImageDetails(this);
} }
public static abstract class Builder<T extends Builder<T>> extends Image.Builder<T> { public static abstract class Builder<T extends Builder<T>> extends Image.Builder<T> {
private long minDisk; protected long minDisk;
private long minRam; protected long minRam;
private Optional<String> location = Optional.absent(); protected String location;
private Optional<String> owner = Optional.absent(); protected String owner;
private Date updatedAt; protected Date updatedAt;
private Date createdAt; protected Date createdAt;
private Optional<Date> deletedAt = Optional.absent(); protected Date deletedAt;
private Status status = Status.UNRECOGNIZED; protected Image.Status status;
private boolean isPublic; protected boolean isPublic;
private Map<String, String> properties = ImmutableMap.of(); protected Map<String, String> properties = ImmutableMap.of();
/** /**
* @see ImageDetails#getMinDisk() * @see ImageDetails#getMinDisk()
@ -76,26 +81,11 @@ public class ImageDetails extends Image {
return self(); return self();
} }
/**
* @see ImageDetails#getLocation()
*/
public T location(Optional<String> location) {
this.location = location;
return self();
}
/** /**
* @see ImageDetails#getLocation() * @see ImageDetails#getLocation()
*/ */
public T location(String location) { public T location(String location) {
return location(Optional.of(location)); this.location = location;
}
/**
* @see ImageDetails#getOwner()
*/
public T owner(Optional<String> owner) {
this.owner = owner;
return self(); return self();
} }
@ -103,7 +93,8 @@ public class ImageDetails extends Image {
* @see ImageDetails#getOwner() * @see ImageDetails#getOwner()
*/ */
public T owner(String owner) { public T owner(String owner) {
return owner(Optional.of(owner)); this.owner = owner;
return self();
} }
/** /**
@ -125,22 +116,15 @@ public class ImageDetails extends Image {
/** /**
* @see ImageDetails#getDeletedAt() * @see ImageDetails#getDeletedAt()
*/ */
public T deletedAt(Optional<Date> deletedAt) { public T deletedAt(Date deletedAt) {
this.deletedAt = deletedAt; this.deletedAt = deletedAt;
return self(); return self();
} }
/**
* @see ImageDetails#getDeletedAt()
*/
public T deletedAt(Date deletedAt) {
return deletedAt(Optional.of(deletedAt));
}
/** /**
* @see ImageDetails#getStatus() * @see ImageDetails#getStatus()
*/ */
public T status(Status status) { public T status(Image.Status status) {
this.status = status; this.status = status;
return self(); return self();
} }
@ -157,18 +141,26 @@ public class ImageDetails extends Image {
* @see ImageDetails#getProperties() * @see ImageDetails#getProperties()
*/ */
public T properties(Map<String, String> properties) { public T properties(Map<String, String> properties) {
this.properties = properties; this.properties = ImmutableMap.copyOf(checkNotNull(properties, "properties"));
return self(); return self();
} }
public ImageDetails build() { public ImageDetails build() {
return new ImageDetails(this); return new ImageDetails(id, name, links, containerFormat, diskFormat, size, checksum, minDisk, minRam, location, owner, updatedAt, createdAt, deletedAt, status, isPublic, properties);
} }
public T fromImageDetails(ImageDetails in) { public T fromImageDetails(ImageDetails in) {
return super.fromImage(in).minDisk(in.getMinDisk()).minRam(in.getMinRam()).location(in.getLocation()) return super.fromImage(in)
.updatedAt(in.getUpdatedAt()).createdAt(in.getCreatedAt()).deletedAt(in.getDeletedAt()).status( .minDisk(in.getMinDisk())
in.getStatus()).isPublic(in.isPublic()).properties(in.getProperties()); .minRam(in.getMinRam())
.location(in.getLocation().orNull())
.owner(in.getOwner().orNull())
.updatedAt(in.getUpdatedAt())
.createdAt(in.getCreatedAt())
.deletedAt(in.getDeletedAt().orNull())
.status(in.getStatus())
.isPublic(in.isPublic())
.properties(in.getProperties());
} }
} }
@ -179,49 +171,42 @@ public class ImageDetails extends Image {
} }
} }
protected ImageDetails() { @Named("min_disk")
// we want serializers like Gson to work w/o using sun.misc.Unsafe, private final long minDisk;
// prohibited in GAE. This also implies fields are not final. @Named("min_ram")
// see http://code.google.com/p/jclouds/issues/detail?id=925 private final long minRam;
} private final Optional<String> location;
private final Optional<String> owner;
@Named("updated_at")
private final Date updatedAt;
@Named("created_at")
private final Date createdAt;
@Named("deleted_at")
private final Optional<Date> deletedAt;
private final Image.Status status;
@Named("is_public")
private final boolean isPublic;
private final Map<String, String> properties;
// | min_disk | int(11) | YES | | NULL | | @ConstructorProperties({
@SerializedName("min_disk") "id", "name", "links", "container_format", "disk_format", "size", "checksum", "min_disk", "min_ram", "location", "owner", "updated_at", "created_at", "deleted_at", "status", "is_public", "properties"
private long minDisk; })
// | min_ram | int(11) | YES | | NULL | | protected ImageDetails(String id, @Nullable String name, Set<Link> links, @Nullable ContainerFormat containerFormat,
@SerializedName("min_ram") @Nullable DiskFormat diskFormat, @Nullable Long size, @Nullable String checksum, long minDisk,
private long minRam; long minRam, @Nullable String location, @Nullable String owner, Date updatedAt,
// | location | text | YES | | NULL | | Date createdAt, @Nullable Date deletedAt, Image.Status status, boolean isPublic,
private Optional<String> location = Optional.absent(); Map<String, String> properties) {
// | owner | varchar(255) | YES | | NULL | | super(id, name, links, containerFormat, diskFormat, size, checksum);
private Optional<String> owner = Optional.absent(); this.minDisk = minDisk;
// | updated_at | datetime | YES | | NULL | | this.minRam = minRam;
@SerializedName("updated_at") this.location = Optional.fromNullable(location);
private Date updatedAt; this.owner = Optional.fromNullable(owner);
// | created_at | datetime | NO | | NULL | | this.updatedAt = checkNotNull(updatedAt, "updatedAt");
@SerializedName("created_at") this.createdAt = checkNotNull(createdAt, "createdAt");
private Date createdAt; this.deletedAt = Optional.fromNullable(deletedAt);
@SerializedName("deleted_at") this.status = checkNotNull(status, "status");
private Optional<Date> deletedAt = Optional.absent(); this.isPublic = isPublic;
// | status | varchar(30) | NO | | NULL | | this.properties = ImmutableMap.copyOf(checkNotNull(properties, "properties"));
private Status status = Status.UNRECOGNIZED;
// | is_public | tinyint(1) | NO | | NULL | |
@SerializedName("is_public")
private boolean isPublic;
private Map<String, String> properties = ImmutableMap.of();
protected ImageDetails(Builder<?> builder) {
super(builder);
this.minDisk = builder.minDisk;
this.minRam = checkNotNull(builder.minRam, "minRam");
this.location = checkNotNull(builder.location, "location");
this.owner = checkNotNull(builder.owner, "owner");
this.updatedAt = checkNotNull(builder.updatedAt, "updatedAt");
this.createdAt = checkNotNull(builder.createdAt, "createdAt");
this.deletedAt = checkNotNull(builder.deletedAt, "deletedAt");
this.status = checkNotNull(builder.status, "status");
this.isPublic = checkNotNull(builder.isPublic, "isPublic");
this.properties = ImmutableMap.copyOf(builder.properties);
} }
/** /**
@ -238,18 +223,14 @@ public class ImageDetails extends Image {
return this.minRam; return this.minRam;
} }
public Status getStatus() {
return this.status;
}
public Optional<String> getLocation() { public Optional<String> getLocation() {
return this.location; return this.location;
} }
public Optional<String> getOwner() { public Optional<String> getOwner() {
return owner; return this.owner;
} }
public Date getUpdatedAt() { public Date getUpdatedAt() {
return this.updatedAt; return this.updatedAt;
} }
@ -262,22 +243,43 @@ public class ImageDetails extends Image {
return this.deletedAt; return this.deletedAt;
} }
public Image.Status getStatus() {
return this.status;
}
public boolean isPublic() { public boolean isPublic() {
return this.isPublic; return this.isPublic;
} }
public Map<String, String> getProperties() { public Map<String, String> getProperties() {
// in case this was assigned in gson return this.properties;
return ImmutableMap.copyOf(Maps.filterValues(this.properties, Predicates.notNull()));
} }
// hashCode/equals from super is ok
@Override @Override
protected ToStringHelper string() { public int hashCode() {
return super.string().add("minDisk", minDisk).add("minRam", minRam).add("location", location).add("deletedAt", return Objects.hashCode(minDisk, minRam, location, owner, updatedAt, createdAt, deletedAt, status, isPublic, properties);
getDeletedAt()).add("updatedAt", updatedAt).add("createdAt", createdAt).add("status", status).add(
"location", location).add("owner", owner).add("isPublic", isPublic).add("properties", properties);
} }
} @Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
ImageDetails that = ImageDetails.class.cast(obj);
return super.equals(that) && Objects.equal(this.minDisk, that.minDisk)
&& Objects.equal(this.minRam, that.minRam)
&& Objects.equal(this.location, that.location)
&& Objects.equal(this.owner, that.owner)
&& Objects.equal(this.updatedAt, that.updatedAt)
&& Objects.equal(this.createdAt, that.createdAt)
&& Objects.equal(this.deletedAt, that.deletedAt)
&& Objects.equal(this.status, that.status)
&& Objects.equal(this.isPublic, that.isPublic)
&& Objects.equal(this.properties, that.properties);
}
protected ToStringHelper string() {
return super.string()
.add("minDisk", minDisk).add("minRam", minRam).add("location", location).add("owner", owner).add("updatedAt", updatedAt).add("createdAt", createdAt).add("deletedAt", deletedAt).add("status", status).add("isPublic", isPublic).add("properties", properties);
}
}

View File

@ -18,21 +18,7 @@
*/ */
package org.jclouds.openstack.glance.v1_0.functions; package org.jclouds.openstack.glance.v1_0.functions;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.CHECKSUM; import static org.jclouds.openstack.glance.v1_0.options.ImageField.*;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.CONTAINER_FORMAT;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.CREATED_AT;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.DELETED_AT;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.DISK_FORMAT;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.ID;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.IS_PUBLIC;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.LOCATION;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.MIN_DISK;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.MIN_RAM;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.NAME;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.OWNER;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.SIZE;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.STATUS;
import static org.jclouds.openstack.glance.v1_0.options.ImageField.UPDATED_AT;
import javax.inject.Inject; import javax.inject.Inject;
@ -40,11 +26,10 @@ import org.jclouds.date.DateService;
import org.jclouds.http.HttpResponse; import org.jclouds.http.HttpResponse;
import org.jclouds.openstack.glance.v1_0.domain.ContainerFormat; import org.jclouds.openstack.glance.v1_0.domain.ContainerFormat;
import org.jclouds.openstack.glance.v1_0.domain.DiskFormat; import org.jclouds.openstack.glance.v1_0.domain.DiskFormat;
import org.jclouds.openstack.glance.v1_0.domain.ImageDetails;
import org.jclouds.openstack.glance.v1_0.domain.Image.Status; import org.jclouds.openstack.glance.v1_0.domain.Image.Status;
import org.jclouds.openstack.glance.v1_0.domain.ImageDetails;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Optional;
/** /**
* This parses {@link ImageDetails} from HTTP headers. * This parses {@link ImageDetails} from HTTP headers.
@ -63,14 +48,14 @@ public class ParseImageDetailsFromHeaders implements Function<HttpResponse, Imag
ImageDetails.Builder<?> builder = ImageDetails.builder() ImageDetails.Builder<?> builder = ImageDetails.builder()
.id(from.getFirstHeaderOrNull(ID.asHeader())) .id(from.getFirstHeaderOrNull(ID.asHeader()))
.name(from.getFirstHeaderOrNull(NAME.asHeader())) .name(from.getFirstHeaderOrNull(NAME.asHeader()))
.checksum(Optional.fromNullable(from.getFirstHeaderOrNull(CHECKSUM.asHeader()))) .checksum(from.getFirstHeaderOrNull(CHECKSUM.asHeader()))
.minDisk(Long.parseLong(from.getFirstHeaderOrNull(MIN_DISK.asHeader()))) .minDisk(Long.parseLong(from.getFirstHeaderOrNull(MIN_DISK.asHeader())))
.minRam(Long.parseLong(from.getFirstHeaderOrNull(MIN_RAM.asHeader()))) .minRam(Long.parseLong(from.getFirstHeaderOrNull(MIN_RAM.asHeader())))
.isPublic(Boolean.parseBoolean(from.getFirstHeaderOrNull(IS_PUBLIC.asHeader()))) .isPublic(Boolean.parseBoolean(from.getFirstHeaderOrNull(IS_PUBLIC.asHeader())))
.createdAt(dateService.iso8601SecondsDateParse(from.getFirstHeaderOrNull(CREATED_AT.asHeader()))) .createdAt(dateService.iso8601SecondsDateParse(from.getFirstHeaderOrNull(CREATED_AT.asHeader())))
.updatedAt(dateService.iso8601SecondsDateParse(from.getFirstHeaderOrNull(UPDATED_AT.asHeader()))) .updatedAt(dateService.iso8601SecondsDateParse(from.getFirstHeaderOrNull(UPDATED_AT.asHeader())))
.owner(Optional.fromNullable(from.getFirstHeaderOrNull(OWNER.asHeader()))) .owner(from.getFirstHeaderOrNull(OWNER.asHeader()))
.location(Optional.fromNullable(from.getFirstHeaderOrNull(LOCATION.asHeader()))) .location(from.getFirstHeaderOrNull(LOCATION.asHeader()))
.status(Status.fromValue(from.getFirstHeaderOrNull(STATUS.asHeader()))); .status(Status.fromValue(from.getFirstHeaderOrNull(STATUS.asHeader())));
String containerFormat = from.getFirstHeaderOrNull(CONTAINER_FORMAT.asHeader()); String containerFormat = from.getFirstHeaderOrNull(CONTAINER_FORMAT.asHeader());

View File

@ -53,7 +53,7 @@ public class ParseImageDetailsTest extends BaseItemParserTest<ImageDetails> {
.containerFormat(ContainerFormat.BARE) .containerFormat(ContainerFormat.BARE)
.diskFormat(DiskFormat.RAW) .diskFormat(DiskFormat.RAW)
.checksum("6ae4e0fdc3c108a1bfe10ef5e436f4f4") .checksum("6ae4e0fdc3c108a1bfe10ef5e436f4f4")
.size(27) .size(27L)
.status(Image.Status.ACTIVE) .status(Image.Status.ACTIVE)
.owner("68a7c7abb7bf45ada1536dfa28ec2115") .owner("68a7c7abb7bf45ada1536dfa28ec2115")
.isPublic(false) .isPublic(false)

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to jclouds, Inc. (jclouds) under one or more * Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file * contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -18,29 +18,30 @@
*/ */
package org.jclouds.openstack.quantum.v1_0.domain; package org.jclouds.openstack.quantum.v1_0.domain;
import java.beans.ConstructorProperties;
/** /**
* A Quantum attachment * A Quantum attachment
* *
* @author Adam Lowe * @author Adam Lowe
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Attachments.html">api doc</a> * @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Attachments.html">api doc</a>
*/ */
public class Attachment extends Reference { public class Attachment extends Reference {
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return new ConcreteBuilder().fromAttachment(this); return new ConcreteBuilder().fromAttachment(this);
} }
public static abstract class Builder<T extends Builder<T>> extends Reference.Builder<T> { public static abstract class Builder<T extends Builder<T>> extends Reference.Builder<T> {
protected abstract T self();
public Attachment build() { public Attachment build() {
return new Attachment(this); return new Attachment(id);
} }
public T fromAttachment(Attachment in) { public T fromAttachment(Attachment in) {
return super.fromReference(in); return super.fromReference(in);
} }
@ -53,11 +54,12 @@ public class Attachment extends Reference {
} }
} }
protected Attachment(Builder<?> builder) {
super(builder); @ConstructorProperties({
"id"
})
protected Attachment(String id) {
super(id);
} }
protected Attachment() { }
// for GSON
}
}

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to jclouds, Inc. (jclouds) under one or more * Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file * contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -20,31 +20,40 @@ package org.jclouds.openstack.quantum.v1_0.domain;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.beans.ConstructorProperties;
import javax.inject.Named;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import com.google.common.collect.ImmutableSet;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper; import com.google.common.base.Objects.ToStringHelper;
/** /**
* A Quantum network * A Quantum network
* *
* @author Adam Lowe * @author Adam Lowe
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a> * @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a>
*/ */
public class Network extends Reference { public class Network extends Reference {
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return new ConcreteBuilder().fromNetwork(this); return new ConcreteBuilder().fromNetwork(this);
} }
public static abstract class Builder<T extends Builder<T>> extends Reference.Builder<T> { public static abstract class Builder<T extends Builder<T>> extends Reference.Builder<T> {
protected abstract T self(); protected String name;
private String name; /**
/**
* @see Network#getName() * @see Network#getName()
*/ */
public T name(String name) { public T name(String name) {
@ -53,11 +62,12 @@ public class Network extends Reference {
} }
public Network build() { public Network build() {
return new Network(this); return new Network(id, name);
} }
public T fromNetwork(Network in) { public T fromNetwork(Network in) {
return super.fromReference(in).name(in.getName()); return super.fromReference(in)
.name(in.getName());
} }
} }
@ -70,25 +80,21 @@ public class Network extends Reference {
private final String name; private final String name;
protected Network(Builder<?> builder) { @ConstructorProperties({
super(builder); "id", "name"
this.name = checkNotNull(builder.name, "name"); })
protected Network(String id, String name) {
super(id);
this.name = checkNotNull(name, "name");
} }
protected Network() {
// for GSON
this.name = null;
}
/**
*/
public String getName() { public String getName() {
return this.name; return this.name;
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hashCode(super.hashCode(), name); return Objects.hashCode(name);
} }
@Override @Override
@ -98,8 +104,10 @@ public class Network extends Reference {
Network that = Network.class.cast(obj); Network that = Network.class.cast(obj);
return super.equals(that) && Objects.equal(this.name, that.name); return super.equals(that) && Objects.equal(this.name, that.name);
} }
protected ToStringHelper string() { protected ToStringHelper string() {
return super.string().add("name", name); return super.string()
.add("name", name);
} }
}
}

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to jclouds, Inc. (jclouds) under one or more * Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file * contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -20,7 +20,7 @@ package org.jclouds.openstack.quantum.v1_0.domain;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections; import java.beans.ConstructorProperties;
import java.util.Set; import java.util.Set;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -29,28 +29,28 @@ import com.google.common.collect.ImmutableSet;
/** /**
* Details of a Quantum network * Details of a Quantum network
* *
* @author Adam Lowe * @author Adam Lowe
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a> * @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a>
*/ */
public class NetworkDetails extends Network { public class NetworkDetails extends Network {
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return new ConcreteBuilder().fromNetworkDetails(this); return new ConcreteBuilder().fromNetworkDetails(this);
} }
public static abstract class Builder<T extends Builder<T>> extends Network.Builder<T> { public static abstract class Builder<T extends Builder<T>> extends Network.Builder<T> {
private Set<Port> ports = ImmutableSet.of(); protected Set<Port> ports = ImmutableSet.of();
/** /**
* @see NetworkDetails#getPorts() * @see NetworkDetails#getPorts()
*/ */
public T ports(Set<Port> ports) { public T ports(Set<Port> ports) {
this.ports = ports; this.ports = ImmutableSet.copyOf(checkNotNull(ports, "ports"));
return self(); return self();
} }
@ -59,11 +59,12 @@ public class NetworkDetails extends Network {
} }
public NetworkDetails build() { public NetworkDetails build() {
return new NetworkDetails(this); return new NetworkDetails(id, name, ports);
} }
public T fromNetworkDetails(NetworkDetails in) { public T fromNetworkDetails(NetworkDetails in) {
return super.fromNetwork(in).ports(in.getPorts()); return super.fromNetwork(in)
.ports(in.getPorts());
} }
} }
@ -76,20 +77,16 @@ public class NetworkDetails extends Network {
private final Set<Port> ports; private final Set<Port> ports;
protected NetworkDetails(Builder<?> builder) { @ConstructorProperties({
super(builder); "id", "name", "ports"
this.ports = ImmutableSet.copyOf(checkNotNull(builder.ports, "ports")); })
protected NetworkDetails(String id, String name, Set<Port> ports) {
super(id, name);
this.ports = ImmutableSet.copyOf(checkNotNull(ports, "ports"));
} }
protected NetworkDetails() {
// for GSON
this.ports = ImmutableSet.of();
}
/**
*/
public Set<Port> getPorts() { public Set<Port> getPorts() {
return Collections.unmodifiableSet(this.ports); return this.ports;
} }
@Override @Override
@ -104,9 +101,10 @@ public class NetworkDetails extends Network {
NetworkDetails that = NetworkDetails.class.cast(obj); NetworkDetails that = NetworkDetails.class.cast(obj);
return super.equals(that) && Objects.equal(this.ports, that.ports); return super.equals(that) && Objects.equal(this.ports, that.ports);
} }
protected ToStringHelper string() { protected ToStringHelper string() {
return super.string().add("ports", ports); return super.string()
.add("ports", ports);
} }
} }

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to jclouds, Inc. (jclouds) under one or more * Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file * contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -20,35 +20,37 @@ package org.jclouds.openstack.quantum.v1_0.domain;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.beans.ConstructorProperties;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper; import com.google.common.base.Objects.ToStringHelper;
/** /**
* A Quantum port * A Quantum port
* *
* @author Adam Lowe * @author Adam Lowe
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Ports.html">api doc</a> * @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Ports.html">api doc</a>
*/ */
public class Port extends Reference { public class Port extends Reference {
/**
*/
public static enum State { public static enum State {
ACTIVE, DOWN ACTIVE, DOWN
} }
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return new ConcreteBuilder().fromPort(this); return new ConcreteBuilder().fromPort(this);
} }
public static abstract class Builder<T extends Builder<T>> extends Reference.Builder<T> { public static abstract class Builder<T extends Builder<T>> extends Reference.Builder<T> {
protected abstract T self(); protected Port.State state;
private Port.State state; /**
/**
* @see Port#getState() * @see Port#getState()
*/ */
public T state(Port.State state) { public T state(Port.State state) {
@ -57,11 +59,12 @@ public class Port extends Reference {
} }
public Port build() { public Port build() {
return new Port(this); return new Port(id, state);
} }
public T fromPort(Port in) { public T fromPort(Port in) {
return fromReference(in).state(in.getState()); return super.fromReference(in)
.state(in.getState());
} }
} }
@ -74,14 +77,12 @@ public class Port extends Reference {
private final Port.State state; private final Port.State state;
protected Port(Builder<?> builder) { @ConstructorProperties({
super(builder); "id", "state"
this.state = checkNotNull(builder.state, "state"); })
} protected Port(String id, Port.State state) {
super(id);
protected Port() { this.state = checkNotNull(state, "state");
// for GSON
this.state = null;
} }
public Port.State getState() { public Port.State getState() {
@ -90,7 +91,7 @@ public class Port extends Reference {
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hashCode(super.hashCode(), state); return Objects.hashCode(state);
} }
@Override @Override
@ -100,8 +101,10 @@ public class Port extends Reference {
Port that = Port.class.cast(obj); Port that = Port.class.cast(obj);
return super.equals(that) && Objects.equal(this.state, that.state); return super.equals(that) && Objects.equal(this.state, that.state);
} }
protected ToStringHelper string() { protected ToStringHelper string() {
return super.string().add("state", state); return super.string()
.add("state", state);
} }
}
}

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to jclouds, Inc. (jclouds) under one or more * Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file * contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -18,6 +18,8 @@
*/ */
package org.jclouds.openstack.quantum.v1_0.domain; package org.jclouds.openstack.quantum.v1_0.domain;
import java.beans.ConstructorProperties;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -25,24 +27,24 @@ import com.google.common.base.Objects.ToStringHelper;
/** /**
* Details of a Quantum Port * Details of a Quantum Port
* *
* @author Adam Lowe * @author Adam Lowe
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Ports.html">api doc</a> * @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Ports.html">api doc</a>
*/ */
public class PortDetails extends Port { public class PortDetails extends Port {
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return new ConcreteBuilder().fromPortDetails(this); return new ConcreteBuilder().fromPortDetails(this);
} }
public static abstract class Builder<T extends Builder<T>> extends Port.Builder<T> { public static abstract class Builder<T extends Builder<T>> extends Port.Builder<T> {
private Attachment attachment; protected Attachment attachment;
/** /**
* @see PortDetails#getAttachment() * @see PortDetails#getAttachment()
*/ */
public T attachment(Attachment attachment) { public T attachment(Attachment attachment) {
@ -51,11 +53,12 @@ public class PortDetails extends Port {
} }
public PortDetails build() { public PortDetails build() {
return new PortDetails(this); return new PortDetails(id, state, attachment);
} }
public T fromPortDetails(PortDetails in) { public T fromPortDetails(PortDetails in) {
return super.fromPort(in).attachment(in.getAttachment()); return super.fromPort(in)
.attachment(in.getAttachment());
} }
} }
@ -66,17 +69,14 @@ public class PortDetails extends Port {
} }
} }
@Nullable
private final Attachment attachment; private final Attachment attachment;
protected PortDetails(Builder<?> builder) { @ConstructorProperties({
super(builder); "id", "state", "attachment"
this.attachment = builder.attachment; })
} protected PortDetails(String id, Port.State state, @Nullable Attachment attachment) {
super(id, state);
protected PortDetails() { this.attachment = attachment;
// for GSON
this.attachment = null;
} }
@Nullable @Nullable
@ -96,9 +96,10 @@ public class PortDetails extends Port {
PortDetails that = PortDetails.class.cast(obj); PortDetails that = PortDetails.class.cast(obj);
return super.equals(that) && Objects.equal(this.attachment, that.attachment); return super.equals(that) && Objects.equal(this.attachment, that.attachment);
} }
protected ToStringHelper string() { protected ToStringHelper string() {
return super.string().add("attachment", attachment); return super.string()
.add("attachment", attachment);
} }
} }

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to jclouds, Inc. (jclouds) under one or more * Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file * contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -20,32 +20,34 @@ package org.jclouds.openstack.quantum.v1_0.domain;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.beans.ConstructorProperties;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper; import com.google.common.base.Objects.ToStringHelper;
/** /**
* A wrapper around an id in the quantum api * A wrapper around an id in the quantum api
* *
* @author Adam Lowe * @author Adam Lowe
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a> * @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a>
*/ */
public class Reference { public class Reference {
public static Builder<?> builder() { public static Builder<?> builder() {
return new ConcreteBuilder(); return new ConcreteBuilder();
} }
public Builder<?> toBuilder() { public Builder<?> toBuilder() {
return new ConcreteBuilder().fromReference(this); return new ConcreteBuilder().fromReference(this);
} }
public static abstract class Builder<T extends Builder<T>> { public static abstract class Builder<T extends Builder<T>> {
protected abstract T self(); protected abstract T self();
private String id; protected String id;
/** /**
* @see org.jclouds.openstack.quantum.v1_0.domain.Reference#getId() * @see Reference#getId()
*/ */
public T id(String id) { public T id(String id) {
this.id = id; this.id = id;
@ -53,11 +55,12 @@ public class Reference {
} }
public Reference build() { public Reference build() {
return new Reference(this); return new Reference(id);
} }
public T fromReference(Reference in) { public T fromReference(Reference in) {
return this.id(in.getId()); return this
.id(in.getId());
} }
} }
@ -70,22 +73,17 @@ public class Reference {
private final String id; private final String id;
protected Reference(Builder<?> builder) { @ConstructorProperties({
this.id = checkNotNull(builder.id, "id"); "id"
})
protected Reference(String id) {
this.id = checkNotNull(id, "id");
} }
protected Reference() {
// for GSON
this.id = null;
}
/**
*/
public String getId() { public String getId() {
return this.id; return this.id;
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hashCode(id); return Objects.hashCode(id);
@ -98,14 +96,15 @@ public class Reference {
Reference that = Reference.class.cast(obj); Reference that = Reference.class.cast(obj);
return Objects.equal(this.id, that.id); return Objects.equal(this.id, that.id);
} }
protected ToStringHelper string() { protected ToStringHelper string() {
return Objects.toStringHelper("").add("id", id); return Objects.toStringHelper(this)
.add("id", id);
} }
@Override @Override
public String toString() { public String toString() {
return string().toString(); return string().toString();
} }
} }

View File

@ -3,6 +3,8 @@ package org.jclouds.openstack.swift.v1.domain;
import static com.google.common.base.Objects.equal; import static com.google.common.base.Objects.equal;
import static com.google.common.base.Objects.toStringHelper; import static com.google.common.base.Objects.toStringHelper;
import java.beans.ConstructorProperties;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper; import com.google.common.base.Objects.ToStringHelper;
@ -48,17 +50,12 @@ public class AccountMetadata {
return containerCount(from.getContainerCount()).bytesUsed(from.getBytesUsed()); return containerCount(from.getContainerCount()).bytesUsed(from.getBytesUsed());
} }
} }
protected AccountMetadata() {
// we want serializers like Gson to work w/o using sun.misc.Unsafe,
// prohibited in GAE. This also implies fields are not final.
// see http://code.google.com/p/jclouds/issues/detail?id=925
}
protected int containerCount; protected int containerCount;
protected long bytesUsed; protected long bytesUsed;
public AccountMetadata(int containerCount, long bytesUsed) { @ConstructorProperties({"containerCount", "bytesUsed"})
protected AccountMetadata(int containerCount, long bytesUsed) {
this.containerCount = containerCount; this.containerCount = containerCount;
this.bytesUsed = bytesUsed; this.bytesUsed = bytesUsed;
} }

View File

@ -4,6 +4,8 @@ import static com.google.common.base.Objects.equal;
import static com.google.common.base.Objects.toStringHelper; import static com.google.common.base.Objects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.beans.ConstructorProperties;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper; import com.google.common.base.Objects.ToStringHelper;
@ -64,18 +66,13 @@ public class ContainerMetadata implements Comparable<ContainerMetadata> {
return name(from.getName()).count(from.getCount()).bytes(from.getBytes()); return name(from.getName()).count(from.getCount()).bytes(from.getBytes());
} }
} }
protected ContainerMetadata() {
// we want serializers like Gson to work w/o using sun.misc.Unsafe,
// prohibited in GAE. This also implies fields are not final.
// see http://code.google.com/p/jclouds/issues/detail?id=925
}
protected String name; protected String name;
protected int count; protected int count;
protected int bytes; protected int bytes;
public ContainerMetadata(String name, int count, int bytes) { @ConstructorProperties({"name", "count", "bytes"})
protected ContainerMetadata(String name, int count, int bytes) {
this.name = checkNotNull(name, "name"); this.name = checkNotNull(name, "name");
this.count = count; this.count = count;
this.bytes = bytes; this.bytes = bytes;