blob: 4de216785c5cdea24adfe0da18a3ddcfcf81b6d1 [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.ec2.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.base.Optional;
/**
* To help you manage your Amazon EC2 instances, images, and other Amazon EC2
* resources, you can assign your own metadata to each resource in the form of
* tags.
*
* @see <a
* href="http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/Using_Tags.html"
* >doc</a>
*
* @author Adrian Cole
*/
public class Tag {
/**
* Describes the well-known resource types that can be tagged.
*/
public static interface ResourceType {
public static final String CUSTOMER_GATEWAY = "customer-gateway";
public static final String DHCP_OPTIONS = "dhcp-options";
public static final String IMAGE = "image";
public static final String INSTANCE = "instance";
public static final String INTERNET_GATEWAY = "internet-gateway";
public static final String NETWORK_ACL = "network-acl";
public static final String RESERVED_INSTANCES = "reserved-instances";
public static final String ROUTE_TABLE = "route-table";
public static final String SECURITY_GROUP = "security-group";
public static final String SNAPSHOT = "snapshot";
public static final String SPOT_INSTANCES_REQUEST = "spot-instances-request";
public static final String SUBNET = "subnet";
public static final String VOLUME = "volume";
public static final String VPC = "vpc";
public static final String VPN_CONNECTION = "vpn-connection";
public static final String VPN_GATEWAY = "vpn-gateway";
}
public static Builder builder() {
return new Builder();
}
public Builder toBuilder() {
return builder().fromTag(this);
}
public static class Builder {
protected String resourceId;
protected String resourceType;
protected String key;
protected Optional<String> value = Optional.absent();
/**
* @see Tag#getResourceId()
*/
public Builder resourceId(String resourceId) {
this.resourceId = resourceId;
return this;
}
/**
* @see Tag#getResourceType()
*/
public Builder resourceType(String resourceType) {
this.resourceType = resourceType;
return this;
}
/**
* @see Tag#getKey()
*/
public Builder key(String key) {
this.key = key;
return this;
}
/**
* @see TagGroup#getValue()
*/
public Builder value(String value) {
this.value = Optional.fromNullable(value);
return this;
}
public Tag build() {
return new Tag(resourceId, resourceType, key, value);
}
public Builder fromTag(Tag in) {
return this.resourceId(in.getResourceId()).resourceType(in.getResourceType()).key(in.getKey())
.value(in.getValue().orNull());
}
}
protected final String resourceId;
protected final String resourceType;
protected final String key;
protected final Optional<String> value;
protected Tag(String resourceId, String resourceType, String key, Optional<String> value) {
this.resourceId = checkNotNull(resourceId, "resourceId");
this.resourceType = checkNotNull(resourceType, "resourceType");
this.key = checkNotNull(key, "key");
this.value = checkNotNull(value, "value");
}
/**
* The resource ID ex. i-erf235
*/
public String getResourceId() {
return resourceId;
}
/**
* The resource type. ex. customer-gateway, dhcp-options, image, instance,
* internet-gateway, network-acl, reserved-instances, route-table,
* security-group, snapshot, spot-instances-request, subnet, volume, vpc,
* vpn-connection, vpn-gateway
*/
public String getResourceType() {
return resourceType;
}
/**
* The tag key.
*/
public String getKey() {
return key;
}
/**
* The tag value.
*/
public Optional<String> getValue() {
return value;
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
return Objects.hashCode(resourceId, key);
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Tag other = (Tag) obj;
return Objects.equal(this.resourceId, other.resourceId) && Objects.equal(this.key, other.key);
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return string().toString();
}
protected ToStringHelper string() {
return Objects.toStringHelper(this).omitNullValues().add("resourceId", resourceId)
.add("resourceType", resourceType).add("key", key).add("value", value.orNull());
}
}