blob: d4769043303dbfcc5eb4699c003eaa1f5fd1cbb6 [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.joyent.cloudapi.v6_5.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.beans.ConstructorProperties;
import java.util.Date;
import java.util.Map;
import javax.inject.Named;
import org.jclouds.domain.JsonBall;
import org.jclouds.joyent.cloudapi.v6_5.domain.Machine.Type;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
/**
* A dataset is the image of the software on your machine. It contains the software packages that
* will be available on newly provisioned machines. In the case of virtual machines, the dataset
* also includes the operating system.
*
* @see <a href= "http://apidocs.joyent.com/sdcapidoc/cloudapi/index.html#ListDatasets" >docs</a>
*/
public class Dataset implements Comparable<Dataset> {
public static Builder builder() {
return new Builder();
}
public Builder toBuilder() {
return new Builder().fromDataset(this);
}
public static class Builder {
private String id;
private String urn;
private String name;
private String os;
private Type type;
private String description;
private boolean isDefault;
private ImmutableMap.Builder<String, JsonBall> requirements = ImmutableMap.<String, JsonBall>builder();
private String version;
private Date created;
/**
* @see Dataset#getId()
*/
public Builder id(String id) {
this.id = id;
return this;
}
/**
* @see Dataset#getUrn()
*/
public Builder urn(String urn) {
this.urn = urn;
return this;
}
/**
* @see Dataset#getName()
*/
public Builder name(String name) {
this.name = name;
return this;
}
/**
* @see Dataset#getOs()
*/
public Builder os(String os) {
this.os = os;
return this;
}
/**
* @see Dataset#getType()
*/
public Builder type(Type type) {
this.type = type;
return this;
}
/**
* @see Dataset#getDescription()
*/
public Builder description(String description) {
this.description = description;
return this;
}
/**
* @see Dataset#isDefault()
*/
public Builder isDefault(boolean isDefault) {
this.isDefault = isDefault;
return this;
}
/**
* @see Dataset#getRequirements()
*/
public Builder requirements(Map<String, JsonBall> requirements) {
this.requirements = ImmutableMap.<String, JsonBall> builder();
this.requirements.putAll(checkNotNull(requirements, "requirements"));
return this;
}
/**
* @see Dataset#getRequirements()
*/
public Builder addRequirement(String name, JsonBall values) {
this.requirements.put(checkNotNull(name, "name"), checkNotNull(values, "value of %s", name));
return this;
}
/**
* @see Dataset#getVersion()
*/
public Builder version(String version) {
this.version = version;
return this;
}
/**
* @see Dataset#getCreated()
*/
public Builder created(Date created) {
this.created = created;
return this;
}
public Dataset build() {
return new Dataset(id, urn, name, os, type, description, isDefault, requirements.build(), version,
created);
}
public Builder fromDataset(Dataset in) {
return id(in.getId()).urn(in.getUrn()).name(in.getName()).os(in.getOs()).type(in.getType()).description(in.getDescription())
.isDefault(in.isDefault()).requirements(in.requirements).version(in.getVersion()).created(in.getCreated());
}
}
private final String id;
private final String name;
private final String os;
private final String urn;
private final Type type;
private final String description;
@Named("default")
private final boolean isDefault;
private final Map<String, JsonBall> requirements;
private final String version;
private final Date created;
@ConstructorProperties({ "id", "urn", "name", "os", "type", "description", "default", "requirements", "version",
"created" })
public Dataset(String id, String urn, String name, String os, Type type, String description, boolean isDefault,
Map<String, JsonBall> requirements, String version, Date created) {
this.id = checkNotNull(id, "id");
this.urn = checkNotNull(urn, "urn of dataset(%s)", id);
this.name = checkNotNull(name, "name of dataset(%s)", id);
this.os = checkNotNull(os, "os of dataset(%s)", id);
this.type = checkNotNull(type, "type of dataset(%s)", id);
this.description = checkNotNull(description, "description of dataset(%s)", id);
this.isDefault = isDefault;
this.requirements = ImmutableMap.copyOf(checkNotNull(requirements, "requirements of dataset(%s)", id));
this.version = checkNotNull(version, "version of dataset(%s)", id);
this.created = checkNotNull(created, "created of dataset(%s)", id);
}
/**
* The globally unique id for this dataset
*/
public String getId() {
return id;
}
/**
* The full URN for this dataset
*/
public String getUrn() {
return urn;
}
/**
* The friendly name for this dataset
*/
public String getName() {
return name;
}
/**
* The underlying operating system for this dataset
*/
public String getOs() {
return os;
}
/**
* Whether this is a smartmachine or virtualmachine dataset
*/
public Type getType() {
return type;
}
/**
* The description of this dataset
*/
public String getDescription() {
return description;
}
/**
* Whether this is the default dataset in this datacenter
*/
public boolean isDefault() {
return isDefault;
}
/**
* If the value is a string, it will be quoted, as that's how json strings are represented.
*
* @return key to a json literal of the value
* @see #getRequirements
* @see Json#fromJson
*/
public Map<String, String> getRequirementsAsJsonLiterals() {
return Maps.transformValues(requirements, Functions.toStringFunction());
}
/**
* Contains a grouping of various minimum requirements for provisioning a machine with this
* dataset. For example 'password' indicates that a password must be provided.
*
* <h4>Note</h4>
*
* requirements can contain arbitrarily complex values. If the value has structure, you should
* use {@link #getRequirementsAsJsonLiterals}
*/
public Map<String, String> getRequirements() {
return Maps.transformValues(requirements, Functions.compose(Functions.toStringFunction(), unquoteString));
}
/**
* The version for this dataset
*/
public String getVersion() {
return version;
}
/**
* When the dataset was created
*/
public Date getCreated() {
return created;
}
@VisibleForTesting
static final Function<JsonBall, String> unquoteString = new Function<JsonBall, String>() {
@Override
public String apply(JsonBall input) {
String value = input.toString();
if (value.length() >= 2 && value.charAt(0) == '"' && value.charAt(input.length() - 1) == '"')
return value.substring(1, input.length() - 1);
return value;
}
};
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object instanceof Dataset) {
Dataset that = Dataset.class.cast(object);
return Objects.equal(id, that.id);
} else {
return false;
}
}
@Override
public int hashCode() {
return Objects.hashCode(id);
}
@Override
public String toString() {
return MoreObjects.toStringHelper("").omitNullValues()
.add("id", id)
.add("urn", urn)
.add("name", name)
.add("os", os)
.add("type", type)
.add("description", description)
.add("default", isDefault)
.add("requirements", requirements)
.add("version", version)
.add("created", created).toString();
}
@Override
public int compareTo(Dataset that) {
return ComparisonChain.start()
.compare(this.urn, that.urn)
.compare(this.name, that.name)
.compare(this.os, that.os)
.compare(this.type, that.type)
.compare(this.description, that.description)
.compare(this.version, that.version)
.compare(this.created, that.created)
.compare(this.id, that.id).result();
}
}