http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java new file mode 100644 index 0000000..63107e7 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java @@ -0,0 +1,179 @@ +/* + * 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.googlecomputeengine.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 static org.jclouds.googlecomputeengine.domain.Resource.Kind; + +import java.beans.ConstructorProperties; +import java.net.URI; +import java.util.Iterator; + +import org.jclouds.collect.IterableWithMarker; + +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableSet; + +/** + * The collection returned from any <code>listFirstPage()</code> method. + */ +public class ListPage<T> extends IterableWithMarker<T> { + + private final Kind kind; + private final String id; + private final URI selfLink; + private final String nextPageToken; + private final Iterable<T> items; + + @ConstructorProperties({ + "kind", "id", "selfLink", "nextPageToken", "items" + }) + protected ListPage(Kind kind, String id, URI selfLink, String nextPageToken, Iterable<T> items) { + this.id = checkNotNull(id, "id"); + this.kind = checkNotNull(kind, "kind of %id", id); + this.selfLink = checkNotNull(selfLink, "selfLink of %id", id); + this.nextPageToken = nextPageToken; + this.items = items != null ? ImmutableSet.copyOf(items) : ImmutableSet.<T>of(); + } + + public Kind getKind() { + return kind; + } + + public String getId() { + return id; + } + + public URI getSelfLink() { + return selfLink; + } + + @Override + public Optional<Object> nextMarker() { + return Optional.<Object>fromNullable(nextPageToken); + } + + @Override + public Iterator<T> iterator() { + return checkNotNull(items, "items").iterator(); + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hashCode(kind, id); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + ListPage<?> that = ListPage.class.cast(obj); + return equal(this.kind, that.kind) + && equal(this.id, that.id); + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return toStringHelper(this) + .omitNullValues() + .add("kind", kind) + .add("id", id) + .add("selfLink", selfLink) + .add("nextPageToken", nextPageToken) + .add("items", items); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static <T> Builder<T> builder() { + return new Builder<T>(); + } + + public Builder<T> toBuilder() { + return new Builder<T>().fromPagedList(this); + } + + public static final class Builder<T> { + + private Kind kind; + private String id; + private URI selfLink; + private String nextPageToken; + private ImmutableSet.Builder<T> items = ImmutableSet.builder(); + + public Builder<T> kind(Kind kind) { + this.kind = kind; + return this; + } + + public Builder<T> id(String id) { + this.id = id; + return this; + } + + public Builder<T> selfLink(URI selfLink) { + this.selfLink = selfLink; + return this; + } + + public Builder<T> addItem(T item) { + this.items.add(item); + return this; + } + + public Builder<T> items(Iterable<T> items) { + this.items.addAll(items); + return this; + } + + public Builder<T> nextPageToken(String nextPageToken) { + this.nextPageToken = nextPageToken; + return this; + } + + public ListPage<T> build() { + return new ListPage<T>(kind, id, selfLink, nextPageToken, items.build()); + } + + public Builder<T> fromPagedList(ListPage<T> in) { + return this + .kind(in.getKind()) + .id(in.getId()) + .selfLink(in.getSelfLink()) + .nextPageToken((String) in.nextMarker().orNull()) + .items(in); + + } + } +}
http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java new file mode 100644 index 0000000..1c59ac7 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java @@ -0,0 +1,360 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; +import java.beans.ConstructorProperties; +import java.net.URI; +import java.util.Date; +import java.util.List; + +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableList; + +/** + * Represents a machine type used to host an instance. + * + * @see <a href="https://developers.google.com/compute/docs/reference/v1/machineTypes"/> + */ +@Beta +public final class MachineType extends Resource { + + private final Integer guestCpus; + private final Integer memoryMb; + private final Integer imageSpaceGb; + private final List<ScratchDisk> scratchDisks; + private final Integer maximumPersistentDisks; + private final Long maximumPersistentDisksSizeGb; + private final String zone; + private final Optional<Deprecated> deprecated; + + @ConstructorProperties({ + "id", "creationTimestamp", "selfLink", "name", "description", "guestCpus", "memoryMb", + "imageSpaceGb", "scratchDisks", "maximumPersistentDisks", "maximumPersistentDisksSizeGb", "zone", + "deprecated" + }) + private MachineType(String id, Date creationTimestamp, URI selfLink, String name, String description, + int guestCpus, int memoryMb, int imageSpaceGb, List<ScratchDisk> scratchDisks, + int maximumPersistentDisks, long maximumPersistentDisksSizeGb, String zone, + @Nullable Deprecated deprecated) { + super(Kind.MACHINE_TYPE, id, creationTimestamp, selfLink, name, description); + this.guestCpus = checkNotNull(guestCpus, "guestCpus of %s", name); + this.memoryMb = checkNotNull(memoryMb, "memoryMb of %s", name); + this.imageSpaceGb = checkNotNull(imageSpaceGb, "imageSpaceGb of %s", name); + this.scratchDisks = scratchDisks == null ? ImmutableList.<ScratchDisk>of() : scratchDisks; + this.maximumPersistentDisks = checkNotNull(maximumPersistentDisks, "maximumPersistentDisks of %s", name); + this.maximumPersistentDisksSizeGb = maximumPersistentDisksSizeGb; + this.zone = checkNotNull(zone, "zone of %s", name); + this.deprecated = fromNullable(deprecated); + } + + /** + * @return count of CPUs exposed to the instance. + */ + public int getGuestCpus() { + return guestCpus; + } + + /** + * @return physical memory assigned to the instance, defined in MB. + */ + public int getMemoryMb() { + return memoryMb; + } + + /** + * @return space allotted for the image, defined in GB. + */ + public int getImageSpaceGb() { + return imageSpaceGb; + } + + /** + * @return extended scratch disks assigned to the instance. + */ + public List<ScratchDisk> getScratchDisks() { + return scratchDisks; + } + + /** + * @return maximum persistent disks allowed. + */ + public int getMaximumPersistentDisks() { + return maximumPersistentDisks; + } + + /** + * @return maximum total persistent disks size (GB) allowed. + */ + public long getMaximumPersistentDisksSizeGb() { + return maximumPersistentDisksSizeGb; + } + + /** + * @return the zones that this machine type can run in. + */ + public String getZone() { + return zone; + } + + /** + * @return the deprecation information for this machine type + */ + public Optional<Deprecated> getDeprecated() { + return deprecated; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + MachineType that = MachineType.class.cast(obj); + return equal(this.kind, that.kind) + && equal(this.name, that.name) + && equal(this.zone, that.zone); + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return super.string() + .add("guestCpus", guestCpus) + .add("memoryMb", memoryMb) + .add("imageSpaceGb", imageSpaceGb) + .add("scratchDisks", scratchDisks) + .add("maximumPersistentDisks", maximumPersistentDisks) + .add("maximumPersistentDisksSizeGb", maximumPersistentDisksSizeGb) + .add("zone", zone) + .add("deprecated", deprecated.orNull()); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder().fromMachineType(this); + } + + public static final class Builder extends Resource.Builder<Builder> { + + private Integer guestCpus; + private Integer memoryMb; + private Integer imageSpaceGb; + private ImmutableList.Builder<ScratchDisk> scratchDisks = ImmutableList.builder(); + private Integer maximumPersistentDisks; + private Long maximumPersistentDisksSizeGb; + private String zone; + private Deprecated deprecated; + + /** + * @see MachineType#getGuestCpus() + */ + public Builder guestCpus(int guesCpus) { + this.guestCpus = guesCpus; + return this; + } + + /** + * @see MachineType#getMemoryMb() + */ + public Builder memoryMb(int memoryMb) { + this.memoryMb = memoryMb; + return this; + } + + /** + * @see MachineType#getImageSpaceGb() + */ + public Builder imageSpaceGb(int imageSpaceGb) { + this.imageSpaceGb = imageSpaceGb; + return this; + } + + /** + * @see MachineType#getScratchDisks() + */ + public Builder addScratchDisk(int diskGb) { + this.scratchDisks.add(ScratchDisk.builder().diskGb(diskGb).build()); + return this; + } + + /** + * @see MachineType#getScratchDisks() + */ + public Builder scratchDisks(List<ScratchDisk> scratchDisks) { + this.scratchDisks.addAll(scratchDisks); + return this; + } + + /** + * @see MachineType#getMaximumPersistentDisks() + */ + public Builder maximumPersistentDisks(int maximumPersistentDisks) { + this.maximumPersistentDisks = maximumPersistentDisks; + return this; + } + + /** + * @see MachineType#getMaximumPersistentDisksSizeGb() + */ + public Builder maximumPersistentDisksSizeGb(long maximumPersistentDisksSizeGb) { + this.maximumPersistentDisksSizeGb = maximumPersistentDisksSizeGb; + return this; + } + + /** + * @see MachineType#getZone() + */ + public Builder zone(String zone) { + this.zone = zone; + return this; + } + + /** + * @see MachineType#getDeprecated() + */ + public Builder deprecated(Deprecated deprecated) { + this.deprecated = deprecated; + return this; + } + + @Override + protected Builder self() { + return this; + } + + public MachineType build() { + return new MachineType(id, creationTimestamp, selfLink, name, description, guestCpus, memoryMb, + imageSpaceGb, scratchDisks.build(), maximumPersistentDisks, maximumPersistentDisksSizeGb, + zone, deprecated); + } + + + public Builder fromMachineType(MachineType in) { + return super.fromResource(in).memoryMb(in.getMemoryMb()).imageSpaceGb(in.getImageSpaceGb()).scratchDisks(in + .getScratchDisks()).maximumPersistentDisks(in.getMaximumPersistentDisks()) + .maximumPersistentDisksSizeGb(in.getMaximumPersistentDisksSizeGb()).zone(in.getZone()) + .deprecated(in.getDeprecated().orNull()); + } + } + + /** + * An scratch disk of a MachineType + */ + public static final class ScratchDisk { + + private final int diskGb; + + @ConstructorProperties({ + "diskGb" + }) + private ScratchDisk(int diskGb) { + this.diskGb = diskGb; + } + + /** + * @return size of the scratch disk, defined in GB. + */ + public int getDiskGb() { + return diskGb; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hashCode(diskGb); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + ScratchDisk that = ScratchDisk.class.cast(obj); + return equal(this.diskGb, that.diskGb); + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return toStringHelper(this) + .add("diskGb", diskGb); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return builder().fromScratchDisk(this); + } + + public static class Builder { + + private int diskGb; + + /** + * @see org.jclouds.googlecomputeengine.domain.MachineType.ScratchDisk#getDiskGb() + */ + public Builder diskGb(int diskGb) { + this.diskGb = diskGb; + return this; + } + + public ScratchDisk build() { + return new ScratchDisk(diskGb); + } + + public Builder fromScratchDisk(ScratchDisk in) { + return new Builder().diskGb(in.getDiskGb()); + } + } + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java new file mode 100644 index 0000000..0a4b5fb --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java @@ -0,0 +1,52 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; + +public class MachineTypeInZone extends SlashEncodedIds { + protected final MachineType machineType; + + public MachineTypeInZone(MachineType machineType, String zoneId) { + super(zoneId, checkNotNull(machineType, "machineType").getName()); + this.machineType = machineType; + } + + public MachineType getMachineType() { + return machineType; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + MachineTypeInZone that = MachineTypeInZone.class.cast(obj); + return equal(this.machineType, that.machineType) + && equal(this.firstId, that.firstId) + && equal(this.secondId, that.secondId); + } + + @Override + public String toString() { + return "[machineType=" + machineType + ", zoneId=" + firstId + "]"; + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Metadata.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Metadata.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Metadata.java new file mode 100644 index 0000000..53a8cfb --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Metadata.java @@ -0,0 +1,139 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; + +import java.beans.ConstructorProperties; +import java.util.Map; + +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableMap; + +/** + * Metadata for an instance or project, with their fingerprint. + */ +public class Metadata { + @Nullable + private final String fingerprint; + private final Map<String, String> items; + + @ConstructorProperties({"fingerprint", "items"}) + public Metadata(@Nullable String fingerprint, @Nullable Map<String, String> items) { + this.fingerprint = fingerprint; + this.items = items == null ? ImmutableMap.<String, String>of() : items; + } + + /** + * @return an optional map of metadata key/value pairs for this instance/project + */ + public Map<String, String> getItems() { + return items; + } + + /** + * Gets the fingerprint for the items - needed for updating them. + * + * @return the fingerprint string for the items. + */ + public String getFingerprint() { + return fingerprint; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hashCode(fingerprint, items); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Metadata that = Metadata.class.cast(obj); + return equal(this.items, that.items) + && equal(this.fingerprint, that.fingerprint); + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return toStringHelper(this) + .add("items", items) + .add("fingerprint", fingerprint); + } + + public static Builder builder() { + return new Builder(); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static final class Builder { + + private ImmutableMap.Builder<String, String> items = ImmutableMap.builder(); + private String fingerprint; + + /** + * @see Metadata#getItems() + */ + public Builder addItem(String key, String value) { + this.items.put(key, value); + return this; + } + + /** + * @see Metadata#getItems() + */ + public Builder items(Map<String, String> items) { + this.items.putAll(items); + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Metadata#getFingerprint() + */ + public Builder fingerprint(String fingerprint) { + this.fingerprint = fingerprint; + return this; + } + + public Metadata build() { + return new Metadata(this.fingerprint, this.items.build()); + } + + public Builder fromMetadata(Metadata in) { + return this.fingerprint(in.getFingerprint()) + .items(in.getItems()); + } + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java new file mode 100644 index 0000000..0919c89 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java @@ -0,0 +1,133 @@ +/* + * 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.googlecomputeengine.domain; + + +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.beans.ConstructorProperties; +import java.net.URI; +import java.util.Date; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Optional; + +/** + * Represents a network used to enable instance communication. + * + * @see <a href="https://developers.google.com/compute/docs/reference/v1/networks"/> + */ +@Beta +public final class Network extends Resource { + + private final String IPv4Range; + private final Optional<String> gatewayIPv4; + + @ConstructorProperties({ + "id", "creationTimestamp", "selfLink", "name", "description", "IPv4Range", + "gatewayIPv4" + }) + protected Network(String id, Date creationTimestamp, URI selfLink, String name, String description, + String IPv4Range, String gatewayIPv4) { + super(Kind.NETWORK, id, creationTimestamp, selfLink, name, description); + this.IPv4Range = checkNotNull(IPv4Range); + this.gatewayIPv4 = fromNullable(gatewayIPv4); + } + + /** + * @return Required; The range of internal addresses that are legal on this network. This range is a CIDR + * specification, for example: 192.168.0.0/16. + */ + public String getIPv4Range() { + return IPv4Range; + } + + /** + * This must be within the range specified by IPv4Range, and is typically the first usable address in that range. + * If not specified, the default value is the first usable address in IPv4Range. + * + * @return an optional address that is used for default routing to other networks. + */ + public Optional<String> getGatewayIPv4() { + return gatewayIPv4; + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return super.string() + .omitNullValues() + .add("IPv4Range", IPv4Range) + .add("gatewayIPv4", gatewayIPv4.orNull()); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder().fromNetwork(this); + } + + public static final class Builder extends Resource.Builder<Builder> { + + private String IPv4Range; + private String gatewayIPv4; + + /** + * @see Network#getIPv4Range() + */ + public Builder IPv4Range(String IPv4Range) { + this.IPv4Range = IPv4Range; + return this; + } + + /** + * @see Network#getGatewayIPv4() + */ + public Builder gatewayIPv4(String gatewayIPv4) { + this.gatewayIPv4 = gatewayIPv4; + return this; + } + + @Override + protected Builder self() { + return this; + } + + public Network build() { + return new Network(super.id, super.creationTimestamp, super.selfLink, super.name, + super.description, IPv4Range, gatewayIPv4); + } + + public Builder fromNetwork(Network in) { + return super.fromResource(in); + } + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java new file mode 100644 index 0000000..deab873 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java @@ -0,0 +1,556 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.beans.ConstructorProperties; +import java.net.URI; +import java.util.Date; +import java.util.List; + +import org.jclouds.http.HttpResponse; +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableList; + +/** + * Describes an operation being executed on some Resource + * + * @see <a href="https://developers.google.com/compute/docs/reference/v1/operations"/> + */ +@Beta +public class Operation extends Resource { + + public static enum Status { + PENDING, + RUNNING, + DONE + } + + private final URI targetLink; + private final Optional<String> targetId; + private final Optional<String> clientOperationId; + private final Status status; + private final Optional<String> statusMessage; + private final String user; + private final Optional<Integer> progress; + private final Date insertTime; + private final Optional<Date> startTime; + private final Optional<Date> endTime; + private final Optional<HttpResponse> httpError; + private final String operationType; + private final List<Error> errors; + private final Optional<URI> zone; + private final Optional<URI> region; + + protected Operation(String id, Date creationTimestamp, URI selfLink, String name, String description, + URI targetLink, String targetId, String clientOperationId, Status status, + String statusMessage, String user, Integer progress, Date insertTime, Date startTime, + Date endTime, Integer httpErrorStatusCode, String httpErrorMessage, String operationType, + @Nullable List<Error> errors, URI region, URI zone) { + super(Kind.OPERATION, id, creationTimestamp, selfLink, name, description); + this.targetLink = checkNotNull(targetLink, "targetLink of %s", name); + this.targetId = fromNullable(targetId); + this.clientOperationId = fromNullable(clientOperationId); + this.status = checkNotNull(status, "status of %s", name); + this.statusMessage = fromNullable(statusMessage); + this.user = checkNotNull(user, "user of %s", name); + this.progress = fromNullable(progress); + this.insertTime = checkNotNull(insertTime, "insertTime of %s", name); + this.startTime = fromNullable(startTime); + this.endTime = fromNullable(endTime); + this.httpError = httpErrorStatusCode != null && httpErrorStatusCode != 0 ? + Optional.of(HttpResponse.builder() + .statusCode(httpErrorStatusCode) + .message(httpErrorMessage) + .build()) + : Optional.<HttpResponse>absent(); + this.operationType = checkNotNull(operationType, "insertTime of %s", name); + this.errors = errors == null ? ImmutableList.<Error>of() : ImmutableList.copyOf(errors); + this.region = fromNullable(region); + this.zone = fromNullable(zone); + } + + /** + * @return URL of the resource the operation is mutating. + */ + public URI getTargetLink() { + return targetLink; + } + + /** + * @return An optional identifier specified by the client when the mutation was initiated. Must be unique for all + * operation resources in the project. + */ + public Optional<String> getClientOperationId() { + return clientOperationId; + } + + /** + * @return unique target id which identifies a particular incarnation of the target. + */ + public Optional<String> getTargetId() { + return targetId; + } + + /** + * @return region this operation is in, if any. + */ + public Optional<URI> getRegion() { + return region; + } + + /** + * @return zone this operation is in, if any. + */ + public Optional<URI> getZone() { + return zone; + } + + /** + * @return Status of the operation. Can be one of the following: PENDING, RUNNING, or DONE. + */ + public Status getStatus() { + return status; + } + + /** + * @return An optional textual description of the current status of the operation. + */ + public Optional<String> getStatusMessage() { + return statusMessage; + } + + /** + * @return User who requested the operation, for example "[email protected]". + */ + public String getUser() { + return user; + } + + /** + * @return an optional progress indicator that ranges from 0 to 100. This should not be used to guess at when the + * operation will be complete. This number should be monotonically increasing as the operation progresses + * (output only). + */ + public Optional<Integer> getProgress() { + return progress; + } + + /** + * @return the time that this operation was requested. + */ + public Date getInsertTime() { + return insertTime; + } + + /** + * @return the time that this operation was started by the server. + */ + public Optional<Date> getStartTime() { + return startTime; + } + + /** + * @return the time that this operation was completed. + */ + public Optional<Date> getEndTime() { + return endTime; + } + + /** + * @return if operation fails, the HttpResponse with error status code returned and the message, e.g. NOT_FOUND. + */ + public Optional<HttpResponse> getHttpError() { + return httpError; + } + + /** + * @return type of the operation. Examples include insert, update, and delete. + */ + public String getOperationType() { + return operationType; + } + + /** + * @return if error occurred during processing of this operation, this field will be populated. + */ + public List<Error> getErrors() { + return errors; + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return super.string() + .omitNullValues() + .add("targetLink", targetLink) + .add("targetId", targetId.orNull()) + .add("clientOperationId", clientOperationId.orNull()) + .add("status", status) + .add("statusMessage", statusMessage.orNull()) + .add("user", user) + .add("progress", progress.orNull()) + .add("insertTime", insertTime) + .add("startTime", startTime.orNull()) + .add("endTime", endTime.orNull()) + .add("httpError", httpError.orNull()) + .add("operationType", operationType) + .add("errors", errors) + .add("region", region.orNull()) + .add("zone", zone.orNull()); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder().fromOperation(this); + } + + public static final class Builder extends Resource.Builder<Builder> { + + private URI targetLink; + private String targetId; + private String clientOperationId; + private Status status; + private String statusMessage; + private String user; + private Integer progress; + private Date insertTime; + private Date startTime; + private Date endTime; + private Integer httpErrorStatusCode; + private String httpErrorMessage; + private String operationType; + private ImmutableList.Builder<Error> errors = ImmutableList.builder(); + private URI region; + private URI zone; + + /** + * @see Operation#getTargetLink() + */ + public Builder targetLink(URI targetLink) { + this.targetLink = targetLink; + return self(); + } + + /** + * @see Operation#getRegion() + */ + public Builder region(URI region) { + this.region = region; + return self(); + } + + /** + * @see Operation#getZone() + */ + public Builder zone(URI zone) { + this.zone = zone; + return self(); + } + + /** + * @see Operation#getTargetId() + */ + public Builder targetId(String targetId) { + this.targetId = targetId; + return self(); + } + + /** + * @see Operation#getClientOperationId() + */ + public Builder clientOperationId(String clientOperationId) { + this.clientOperationId = clientOperationId; + return self(); + } + + /** + * @see Operation#getStatus() + */ + public Builder status(Status status) { + this.status = status; + return self(); + } + + /** + * @see Operation#getStatusMessage() + */ + public Builder statusMessage(String statusMessage) { + this.statusMessage = statusMessage; + return self(); + } + + /** + * @see Operation#getUser() + */ + public Builder user(String user) { + this.user = user; + return self(); + } + + /** + * @see Operation#getProgress() + */ + public Builder progress(Integer progress) { + this.progress = progress; + return self(); + } + + /** + * @see Operation#getInsertTime() + */ + public Builder insertTime(Date insertTime) { + this.insertTime = insertTime; + return self(); + } + + /** + * @see Operation#getStartTime() + */ + public Builder startTime(Date startTime) { + this.startTime = startTime; + return self(); + } + + /** + * @see Operation#getEndTime() + */ + public Builder endTime(Date endTime) { + this.endTime = endTime; + return self(); + } + + /** + * @see Operation#getHttpError() + */ + public Builder httpErrorStatusCode(Integer httpErrorStatusCode) { + this.httpErrorStatusCode = httpErrorStatusCode; + return self(); + } + + /** + * @see Operation#getHttpError() + */ + public Builder httpErrorMessage(String httpErrorMessage) { + this.httpErrorMessage = httpErrorMessage; + return self(); + } + + /** + * @see Operation#getOperationType() + */ + public Builder operationType(String operationType) { + this.operationType = operationType; + return self(); + } + + /** + * @see Operation#getErrors() + */ + public Builder errors(Iterable<Error> errors) { + if (errors != null) + this.errors.addAll(errors); + return self(); + } + + /** + * @see Operation#getErrors() + */ + public Builder addError(Error error) { + this.errors.add(error); + return self(); + } + + @Override + protected Builder self() { + return this; + } + + public Operation build() { + return new Operation(super.id, super.creationTimestamp, super.selfLink, super.name, + super.description, targetLink, targetId, clientOperationId, status, statusMessage, user, progress, + insertTime, startTime, endTime, httpErrorStatusCode, httpErrorMessage, operationType, + errors.build(), region, zone); + } + + public Builder fromOperation(Operation in) { + return super.fromResource(in) + .targetLink(in.getTargetLink()) + .targetId(in.getTargetId().orNull()) + .clientOperationId(in.getClientOperationId().orNull()) + .status(in.getStatus()) + .statusMessage(in.getStatusMessage().orNull()) + .user(in.getUser()) + .progress(in.getProgress().get()) + .insertTime(in.getInsertTime()) + .startTime(in.getStartTime().orNull()) + .endTime(in.getEndTime().orNull()) + .httpErrorStatusCode(in.getHttpError().isPresent() ? in.getHttpError().get().getStatusCode() : null) + .httpErrorMessage(in.getHttpError().isPresent() ? in.getHttpError().get().getMessage() : null) + .operationType(in.getOperationType()).errors(in.getErrors()) + .zone(in.getZone().orNull()).region(in.getRegion().orNull()); + } + } + + /** + * A particular error for an operation including the details. + */ + public static final class Error { + + private final String code; + private final Optional<String> location; + private final Optional<String> message; + + @ConstructorProperties({ + "code", "location", "message" + }) + private Error(String code, String location, String message) { + this.code = checkNotNull(code, "code"); + this.location = fromNullable(location); + this.message = fromNullable(message); + } + + /** + * @return the error type identifier for this error. + */ + public String getCode() { + return code; + } + + /** + * @return indicates the field in the request which caused the error.. + */ + public Optional<String> getLocation() { + return location; + } + + /** + * @return an optional, human-readable error message. + */ + public Optional<String> getMessage() { + return message; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hashCode(code, location, message); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Error that = Error.class.cast(obj); + return equal(this.code, that.code) + && equal(this.location, that.location) + && equal(this.message, that.message); + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return toStringHelper(this) + .omitNullValues() + .add("code", code) + .add("location", location.orNull()) + .add("message", message.orNull()); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return builder().fromOperationErrorDetail(this); + } + + public static final class Builder { + + private String code; + private String location; + private String message; + + /** + * @see org.jclouds.googlecomputeengine.domain.Operation.Error#getCode() + */ + public Builder code(String code) { + this.code = code; + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Operation.Error#getLocation() + */ + public Builder location(String location) { + this.location = location; + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Operation.Error#getMessage() + */ + public Builder message(String message) { + this.message = message; + return this; + } + + public Error build() { + return new Error(code, location, message); + } + + public Builder fromOperationErrorDetail(Error in) { + return new Builder().code(in.getCode()).location(in.getLocation().orNull()).message + (in.getMessage().orNull()); + } + } + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java new file mode 100644 index 0000000..ac3867b --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java @@ -0,0 +1,162 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Date; +import java.util.Set; + +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableSet; + +/** + * A Project resource is the root collection and settings resource for all Google Compute Engine resources. + * + * @see <a href="https://developers.google.com/compute/docs/projects"/> + */ +@Beta +public class Project extends Resource { + + private final Metadata commonInstanceMetadata; + private final Set<Quota> quotas; + private final Set<String> externalIpAddresses; + + protected Project(String id, Date creationTimestamp, URI selfLink, String name, String description, + Metadata commonInstanceMetadata, Set<Quota> quotas, Set<String> externalIpAddresses) { + super(Kind.PROJECT, id, creationTimestamp, selfLink, name, description); + this.commonInstanceMetadata = checkNotNull(commonInstanceMetadata, "commonInstanceMetadata"); + this.quotas = quotas == null ? ImmutableSet.<Quota>of() : ImmutableSet.copyOf(quotas); + this.externalIpAddresses = externalIpAddresses == null ? ImmutableSet.<String>of() : ImmutableSet.copyOf + (externalIpAddresses); + } + + /** + * @return metadata key/value pairs available to all instances contained in this project. + */ + public Metadata getCommonInstanceMetadata() { + return commonInstanceMetadata; + } + + /** + * @return quotas assigned to this project. + */ + public Set<Quota> getQuotas() { + return quotas; + } + + /** + * @return internet available IP addresses available for use in this project. + */ + @Nullable + public Set<String> getExternalIpAddresses() { + return externalIpAddresses; + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return super.string() + .add("commonInstanceMetadata", commonInstanceMetadata) + .add("quotas", quotas) + .add("externalIpAddresses", externalIpAddresses); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder().fromProject(this); + } + + public static final class Builder extends Resource.Builder<Builder> { + + private Metadata commonInstanceMetadata; + private ImmutableSet.Builder<Quota> quotas = ImmutableSet.builder(); + private ImmutableSet.Builder<String> externalIpAddresses = ImmutableSet.builder(); + + /** + * @see Project#getCommonInstanceMetadata() + */ + public Builder commonInstanceMetadata(Metadata commonInstanceMetadata) { + this.commonInstanceMetadata = commonInstanceMetadata; + return this; + } + + /** + * @see Project#getQuotas() + */ + public Builder addQuota(String metric, double usage, double limit) { + this.quotas.add(Quota.builder().metric(metric).usage(usage).limit(limit).build()); + return this; + } + + /** + * @see Project#getQuotas() + */ + public Builder quotas(Set<Quota> quotas) { + this.quotas.addAll(checkNotNull(quotas)); + return this; + } + + /** + * @see Project#getExternalIpAddresses() + */ + public Builder addExternalIpAddress(String externalIpAddress) { + this.externalIpAddresses.add(checkNotNull(externalIpAddress, "externalIpAddress")); + return this; + } + + /** + * @see Project#getExternalIpAddresses() + */ + public Builder externalIpAddresses(Set<String> externalIpAddresses) { + this.externalIpAddresses.addAll(checkNotNull(externalIpAddresses, "externalIpAddresses")); + return this; + } + + @Override + protected Builder self() { + return this; + } + + public Project build() { + return new Project(super.id, super.creationTimestamp, super.selfLink, super.name, + super.description, commonInstanceMetadata, quotas.build(), externalIpAddresses.build()); + } + + public Builder fromProject(Project in) { + return super.fromResource(in).commonInstanceMetadata(in.getCommonInstanceMetadata()).quotas(in.getQuotas()) + .externalIpAddresses(in.getExternalIpAddresses()); + } + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java new file mode 100644 index 0000000..3c17130 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java @@ -0,0 +1,152 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.beans.ConstructorProperties; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Objects.ToStringHelper; + +/** + * Quotas assigned to a given project or region. + * + * @see <a href="https://developers.google.com/compute/docs/reference/v1/projects#resource"/> + */ +@Beta +public class Quota { + private String metric; + private double usage; + private double limit; + + @ConstructorProperties({ + "metric", "usage", "limit" + }) + public Quota(String metric, Double usage, Double limit) { + this.metric = metric != null ? metric : "undefined"; + this.usage = checkNotNull(usage, "usage"); + this.limit = checkNotNull(limit, "limit"); + } + + /** + * @return name of the quota metric. + */ + public String getMetric() { + return metric; + } + + /** + * @return current usage of this metric. + */ + public Double getUsage() { + return usage; + } + + /** + * @return quota limit for this metric. + */ + public Double getLimit() { + return limit; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hashCode(metric); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || this.getClass() != obj.getClass()) return false; + Quota that = Quota.class.cast(obj); + return Objects.equal(this.metric, that.metric); + } + + /** + * {@inheritDoc} + */ + public ToStringHelper string() { + return Objects.toStringHelper(this) + .omitNullValues() + .add("metric", metric) + .add("usage", usage) + .add("limit", limit); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return builder().fromQuota(this); + } + + public static class Builder { + + private String metric; + private Double usage; + private Double limit; + + /** + * @see org.jclouds.googlecomputeengine.domain.Quota#getMetric() + */ + public Builder metric(String metric) { + this.metric = checkNotNull(metric, "metric"); + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Quota#getUsage() + */ + public Builder usage(Double usage) { + this.usage = usage; + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Quota#getLimit() + */ + public Builder limit(Double limit) { + this.limit = limit; + return this; + } + + public Quota build() { + return new Quota(metric, usage, limit); + } + + public Builder fromQuota(Quota quota) { + return new Builder().metric(quota.getMetric()).usage(quota.getUsage()).limit(quota.getLimit()); + } + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java new file mode 100644 index 0000000..aa459bf --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java @@ -0,0 +1,175 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.beans.ConstructorProperties; +import java.net.URI; +import java.util.Date; +import java.util.Set; + +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableSet; + +/** + * Represents a region resource. + * + * @see <a href="https://developers.google.com/compute/docs/reference/v1/regions"/> + */ +@Beta +public final class Region extends Resource { + + public enum Status { + UP, + DOWN + } + + private final Status status; + private final Set<URI> zones; + private final Set<Quota> quotas; + + @ConstructorProperties({ + "id", "creationTimestamp", "selfLink", "name", "description", "status", + "zones", "quotas" + }) + private Region(String id, Date creationTimestamp, URI selfLink, String name, String description, + Status status, Set<URI> zones, Set<Quota> quotas) { + super(Kind.REGION, id, creationTimestamp, selfLink, name, description); + this.status = checkNotNull(status, "status of %name", name); + this.zones = zones == null ? ImmutableSet.<URI>of() : ImmutableSet + .copyOf(zones); + this.quotas = quotas == null ? ImmutableSet.<Quota>of() : ImmutableSet.copyOf(quotas); + } + + /** + * @return Status of the region. "UP" or "DOWN". + */ + public Status getStatus() { + return status; + } + + /** + * @return the zones that can be used in this region. + */ + @Nullable + public Set<URI> getZones() { + return zones; + } + + /** + * @return quotas assigned to this project. + */ + public Set<Quota> getQuotas() { + return quotas; + } + + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return super.string() + .add("status", status) + .add("zones", zones) + .add("quotas", quotas); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder().fromRegion(this); + } + + public static final class Builder extends Resource.Builder<Builder> { + + private Status status; + private ImmutableSet.Builder<URI> zones = ImmutableSet.builder(); + private ImmutableSet.Builder<Quota> quotas = ImmutableSet.builder(); + + /** + * @see org.jclouds.googlecomputeengine.domain.Region#getStatus() + */ + public Builder status(Status status) { + this.status = status; + return this; + } + + /** + * @see Region#getZones() + */ + public Builder zone(URI zone) { + this.zones.add(checkNotNull(zone, "zone")); + return this; + } + + /** + * @see Region#getZones() + */ + public Builder zones(Set<URI> zones) { + this.zones.addAll(checkNotNull(zones, "zones")); + return this; + } + + /** + * @see Region#getQuotas() + */ + public Builder addQuota(String metric, double usage, double limit) { + this.quotas.add(Quota.builder().metric(metric).usage(usage).limit(limit).build()); + return this; + } + + /** + * @see Region#getQuotas() + */ + public Builder quotas(Set<Quota> quotas) { + this.quotas.addAll(checkNotNull(quotas)); + return this; + } + + @Override + protected Builder self() { + return this; + } + + public Region build() { + return new Region(super.id, super.creationTimestamp, super.selfLink, super.name, + super.description, status, zones.build(), quotas.build()); + } + + public Builder fromRegion(Region in) { + return super.fromResource(in) + .status(in.getStatus()) + .zones(in.getZones()) + .quotas(in.getQuotas()); + } + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java new file mode 100644 index 0000000..4d0a1c8 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java @@ -0,0 +1,283 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Objects.ToStringHelper; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.beans.ConstructorProperties; +import java.net.URI; +import java.util.Date; + +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.annotations.Beta; +import com.google.common.base.CaseFormat; +import com.google.common.base.Joiner; +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; + +/** + * Base class for Google Compute Engine resources. + */ +@Beta +public class Resource { + + public enum Kind { + ADDRESS, + ADDRESS_LIST, + DISK, + DISK_LIST, + FIREWALL, + FIREWALL_LIST, + IMAGE, + IMAGE_LIST, + OPERATION, + OPERATION_LIST, + INSTANCE, + INSTANCE_LIST, + MACHINE_TYPE, + MACHINE_TYPE_LIST, + PROJECT, + NETWORK, + NETWORK_LIST, + REGION, + REGION_LIST, + ROUTE, + ROUTE_LIST, + SNAPSHOT, + SNAPSHOT_LIST, + ZONE, + ZONE_LIST; + + public String value() { + return Joiner.on("#").join("compute", CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name())); + } + + @Override + public String toString() { + return value(); + } + + public static Kind fromValue(String kind) { + return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat + .UPPER_UNDERSCORE, + Iterables.getLast(Splitter.on("#").split(checkNotNull(kind, + "kind"))))); + } + } + + protected final Kind kind; + protected final String id; + protected final Optional<Date> creationTimestamp; + protected final URI selfLink; + protected final String name; + protected final Optional<String> description; + + @ConstructorProperties({ + "kind", "id", "creationTimestamp", "selfLink", "name", "description" + }) + protected Resource(Kind kind, String id, Date creationTimestamp, URI selfLink, String name, + String description) { + this.kind = checkNotNull(kind, "kind"); + this.id = checkNotNull(id, "id"); + this.creationTimestamp = fromNullable(creationTimestamp); + this.selfLink = checkNotNull(selfLink, "selfLink"); + this.name = checkNotNull(name, "name"); + this.description = fromNullable(description); + } + + /** + * @return the Type of the resource + */ + public Kind getKind() { + return kind; + } + + /** + * @return unique identifier for the resource; defined by the server. + */ + public String getId() { + return id; + } + + /** + * @return creation timestamp in RFC3339 text format. + */ + public Optional<Date> getCreationTimestamp() { + return creationTimestamp; + } + + /** + * @return server defined URL for the resource. + */ + public URI getSelfLink() { + return selfLink; + } + + /** + * @return name of the resource. + */ + public String getName() { + return name; + } + + /** + * @return an optional textual description of the resource. + */ + @Nullable + public Optional<String> getDescription() { + return description; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hashCode(kind, name); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Resource that = Resource.class.cast(obj); + return equal(this.kind, that.kind) + && equal(this.name, that.name); + } + + /** + * {@inheritDoc} + */ + protected ToStringHelper string() { + return toStringHelper(this) + .omitNullValues() + .add("kind", kind) + .add("id", id) + .add("name", name) + .add("creationTimestamp", creationTimestamp.orNull()) + .add("selfLink", selfLink) + .add("name", name) + .add("description", description.orNull()); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder<?> builder() { + return new ConcreteBuilder(); + } + + public Builder<?> toBuilder() { + return new ConcreteBuilder().fromResource(this); + } + + public abstract static class Builder<T extends Builder<T>> { + + protected abstract T self(); + + protected Kind kind; + protected String id; + protected Date creationTimestamp; + protected URI selfLink; + protected String name; + protected String description; + + /** + * @see Resource#getKind() + */ + protected T kind(Kind kind) { + this.kind = kind; + return self(); + } + + /** + * @see Resource#getId() + */ + public T id(String id) { + this.id = id; + return self(); + } + + /** + * @see Resource#getCreationTimestamp() + */ + public T creationTimestamp(Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; + return self(); + } + + /** + * @see Resource#getSelfLink() + */ + public T selfLink(URI selfLink) { + this.selfLink = selfLink; + return self(); + } + + /** + * @see Resource#getName() + */ + public T name(String name) { + this.name = name; + return self(); + } + + /** + * @see Resource#getDescription() + */ + public T description(String description) { + this.description = description; + return self(); + } + + public Resource build() { + return new Resource(kind, id, creationTimestamp, selfLink, name, description); + } + + public T fromResource(Resource in) { + return this + .kind(in.getKind()) + .id(in.getId()) + .creationTimestamp(in.getCreationTimestamp().orNull()) + .selfLink(in.getSelfLink()) + .name(in.getName()) + .description(in.getDescription().orNull()); + } + } + + private static class ConcreteBuilder extends Builder<ConcreteBuilder> { + @Override + protected ConcreteBuilder self() { + return this; + } + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java new file mode 100644 index 0000000..df5bb1d --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java @@ -0,0 +1,433 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.beans.ConstructorProperties; +import java.net.URI; +import java.util.Date; +import java.util.Map; +import java.util.Set; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +/** + * Represents a route resource. + * + * @see <a href="https://developers.google.com/compute/docs/reference/v1/routes"/> + */ +@Beta +public final class Route extends Resource { + + private final URI network; + private final Set<String> tags; + private final String destRange; + private final Integer priority; + private final Optional<URI> nextHopInstance; + private final Optional<String> nextHopIp; + private final Optional<URI> nextHopNetwork; + private final Optional<URI> nextHopGateway; + private final Set<Warning> warnings; + + @ConstructorProperties({ + "id", "creationTimestamp", "selfLink", "name", "description", "network", "tags", + "destRange", "priority", "nextHopInstance", "nextHopIp", "nextHopNetwork", + "nextHopGateway", "warnings" + }) + private Route(String id, Date creationTimestamp, URI selfLink, String name, String description, + URI network, Set<String> tags, String destRange, Integer priority, + URI nextHopInstance, String nextHopIp, URI nextHopNetwork, + URI nextHopGateway, Set<Warning> warnings) { + super(Kind.ROUTE, id, creationTimestamp, selfLink, name, description); + this.network = checkNotNull(network, "network for %name", name); + this.tags = tags == null ? ImmutableSet.<String>of() : tags; + this.destRange = checkNotNull(destRange, "destination range for %name", name); + this.priority = checkNotNull(priority, "priority of %name", name); + this.nextHopInstance = fromNullable(nextHopInstance); + this.nextHopIp = fromNullable(nextHopIp); + this.nextHopNetwork = fromNullable(nextHopNetwork); + this.nextHopGateway = fromNullable(nextHopGateway); + this.warnings = warnings == null ? ImmutableSet.<Warning>of() : warnings; + } + + /** + * @return Network for this Route. + */ + public URI getNetwork() { + return network; + } + + /** + * @return The set of instance items to which this route applies. + */ + public Set<String> getTags() { + return tags; + } + + /** + * @return The destination range of outgoing packets that this route applies to. + */ + public String getDestRange() { + return destRange; + } + + /** + * @return The priority of this route. Priority is used to break ties in the case + * where there is more than one matching route of maximum length. A lower value + * is higher priority; a priority of 100 is higher than 200. + */ + public Integer getPriority() { + return priority; + } + + /** + * @return The fully-qualified URL to an instance that should handle matching packets. + */ + public Optional<URI> getNextHopInstance() { + return nextHopInstance; + } + + /** + * @return The network IP address of an instance that should handle matching packets. + */ + public Optional<String> getNextHopIp() { + return nextHopIp; + } + + /** + * @return The URL of the local network if it should handle matching packets. + */ + public Optional<URI> getNextHopNetwork() { + return nextHopNetwork; + } + + /** + * @return The URL to a gateway that should handle matching packets. Currently, this is only the internet gateway. + */ + public Optional<URI> getNextHopGateway() { + return nextHopGateway; + } + + /** + * @return If potential misconfigurations are detected for this route, this field will be populated with warning messages. + */ + public Set<Warning> getWarnings() { + return warnings; + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return super.string() + .add("network", network) + .add("tags", tags) + .add("destRange", destRange) + .add("priority", priority) + .add("nextHopInstance", nextHopInstance.orNull()) + .add("nextHopIp", nextHopIp.orNull()) + .add("nextHopNetwork", nextHopNetwork.orNull()) + .add("nextHopGateway", nextHopGateway.orNull()) + .add("warnings", warnings); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder().fromRoute(this); + } + + public static final class Builder extends Resource.Builder<Builder> { + + private URI network; + private ImmutableSet.Builder<String> tags = ImmutableSet.builder(); + private String destRange; + private Integer priority; + private URI nextHopInstance; + private String nextHopIp; + private URI nextHopNetwork; + private URI nextHopGateway; + private ImmutableSet.Builder<Warning> warnings = ImmutableSet.builder(); + + + /** + * @see Route#getNetwork() + */ + public Builder network(URI network) { + this.network = network; + return this; + } + + /** + * @see Route#getTags() + */ + public Builder addTag(String tag) { + this.tags.add(tag); + return this; + } + + /** + * @see Route#getTags() + */ + public Builder tags(Set<String> tags) { + this.tags.addAll(tags); + return this; + } + + /** + * @see Route#getDestRange() + */ + public Builder destRange(String destRange) { + this.destRange = destRange; + return this; + } + + /** + * @see Route#getPriority() + */ + public Builder priority(Integer priority) { + this.priority = priority; + return this; + } + + /** + * @see Route#getNextHopInstance() + */ + public Builder nextHopInstance(URI nextHopInstance) { + this.nextHopInstance = nextHopInstance; + return this; + } + + /** + * @see Route#getNextHopIp() + */ + public Builder nextHopIp(String nextHopIp) { + this.nextHopIp = nextHopIp; + return this; + } + + /** + * @see Route#getNextHopNetwork() + */ + public Builder nextHopNetwork(URI nextHopNetwork) { + this.nextHopNetwork = nextHopNetwork; + return this; + } + + /** + * @see Route#getNextHopGateway() + */ + public Builder nextHopGateway(URI nextHopGateway) { + this.nextHopGateway = nextHopGateway; + return this; + } + + /** + * @see Route#getWarnings() + */ + public Builder addWarning(Warning warning) { + this.warnings.add(warning); + return this; + } + + /** + * @see Route#getWarnings() + */ + public Builder warnings(Set<Warning> warnings) { + this.warnings.addAll(warnings); + return this; + } + + + @Override + protected Builder self() { + return this; + } + + public Route build() { + return new Route(super.id, super.creationTimestamp, super.selfLink, super.name, + super.description, network, tags.build(), destRange, priority, + nextHopInstance, nextHopIp, nextHopNetwork, nextHopGateway, + warnings.build()); + } + + public Builder fromRoute(Route in) { + return super.fromResource(in) + .network(in.getNetwork()) + .tags(in.getTags()) + .destRange(in.getDestRange()) + .priority(in.getPriority()) + .nextHopInstance(in.getNextHopInstance().orNull()) + .nextHopIp(in.getNextHopIp().orNull()) + .nextHopNetwork(in.getNextHopNetwork().orNull()) + .nextHopGateway(in.getNextHopGateway().orNull()) + .warnings(in.getWarnings()); + } + } + + /** + * If potential misconfigurations are detected for this route, this field will be populated with warning messages. + */ + public static class Warning { + private final String code; + private final Optional<String> message; + private final Map<String, String> data; + + @ConstructorProperties({ + "code", "message", "data" + }) + public Warning(String code, String message, Map<String, String> data) { + this.code = checkNotNull(code, "code"); + this.message = fromNullable(message); + this.data = data == null ? ImmutableMap.<String, String>of() : data; + } + + /** + * @return The warning type identifier for this warning. + */ + public String getCode() { + return code; + } + + /** + * @return Optional human-readable details for this warning. + */ + public Optional<String> getMessage() { + return message; + } + + /** + * @return Metadata for this warning + */ + public Map<String, String> getData() { + return data; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hashCode(code, message, data); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Warning that = Warning.class.cast(obj); + return equal(this.code, that.code) + && equal(this.message, that.message) + && equal(this.data, that.data); + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return toStringHelper(this) + .add("code", code) + .add("message", message) + .add("data", data); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return builder().fromWarning(this); + } + + public static final class Builder { + private String code; + private String message; + private ImmutableMap.Builder<String, String> data = ImmutableMap.builder(); + + /** + * @see Warning#getCode() + */ + public Builder code(String code) { + this.code = code; + return this; + } + + /** + * @see Warning#getMessage() + */ + public Builder message(String message) { + this.message = message; + return this; + } + + /** + * @see Warning#getData() + */ + public Builder data(Map<String, String> data) { + this.data = new ImmutableMap.Builder<String, String>().putAll(data); + return this; + } + + /** + * @see Warning#getData() + */ + public Builder addData(String key, String value) { + this.data.put(checkNotNull(key, "key"), checkNotNull(value, "value of %s", key)); + return this; + } + + public Warning build() { + return new Warning(code, message, data.build()); + } + + public Builder fromWarning(Warning in) { + return this.code(in.getCode()) + .message(in.getMessage().orNull()) + .data(in.getData()); + } + } + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java new file mode 100644 index 0000000..0080b29 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java @@ -0,0 +1,83 @@ +/* + * 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.googlecomputeengine.domain; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.Objects; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; + +public class SlashEncodedIds { + public static SlashEncodedIds fromSlashEncoded(String id) { + Iterable<String> parts = Splitter.on('/').split(checkNotNull(id, "id")); + checkArgument(Iterables.size(parts) == 2, "id must be in format firstId/secondId"); + return new SlashEncodedIds(Iterables.get(parts, 0), Iterables.get(parts, 1)); + } + + public static SlashEncodedIds fromTwoIds(String firstId, String secondId) { + return new SlashEncodedIds(firstId, secondId); + } + + private static String slashEncodeTwoIds(String firstId, String secondId) { + return checkNotNull(firstId, "firstId") + "/" + checkNotNull(secondId, "secondId"); + } + + public String slashEncode() { + return slashEncodeTwoIds(firstId, secondId); + } + + protected final String firstId; + protected final String secondId; + + protected SlashEncodedIds(String firstId, String secondId) { + this.firstId = checkNotNull(firstId, "firstId"); + this.secondId = checkNotNull(secondId, "secondId"); + } + + @Override + public int hashCode() { + return Objects.hashCode(firstId, secondId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SlashEncodedIds other = (SlashEncodedIds) obj; + return Objects.equal(firstId, other.firstId) && Objects.equal(secondId, other.secondId); + } + + public String getFirstId() { + return firstId; + } + + public String getSecondId() { + return secondId; + } + + @Override + public String toString() { + return "[firstId=" + firstId + ", secondId=" + secondId + "]"; + } + +}
