From 2bf4925cb3fa8fa782b78de164e3a841bf5fdf4f Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Fri, 15 Jan 2016 17:54:12 -0800 Subject: [PATCH 01/50] Initial project for Google Cloud DNS in gcloud-java --- gcloud-java-dns/pom.xml | 54 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 gcloud-java-dns/pom.xml diff --git a/gcloud-java-dns/pom.xml b/gcloud-java-dns/pom.xml new file mode 100644 index 000000000000..55d720bc0a36 --- /dev/null +++ b/gcloud-java-dns/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + com.google.gcloud + gcloud-java-dns + jar + GCloud Java DNS + + Java idiomatic client for Google Cloud DNS. + + + com.google.gcloud + gcloud-java-pom + 0.1.3-SNAPSHOT + + + gcloud-java-dns + + + + ${project.groupId} + gcloud-java-core + ${project.version} + + + com.google.apis + google-api-services-dns + v1-rev7-1.21.0 + compile + + + com.google.guava + guava-jdk5 + + + com.google.api-client + google-api-client + + + + + junit + junit + 4.12 + test + + + org.easymock + easymock + 3.3 + test + + + From fe4e137fce65882465ca0e092761e080f366fece Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Fri, 15 Jan 2016 17:56:24 -0800 Subject: [PATCH 02/50] Added DnsRecord as a part of the basic data model. ManagedZoneInfo is to be completed and it is included only as it is required as a builder parameter. This class will change in the near future. --- .../java/com/google/gcloud/dns/DnsRecord.java | 254 ++++++++++++++++++ .../google/gcloud/dns/ManagedZoneInfo.java | 44 +++ .../com/google/gcloud/dns/DnsRecordTest.java | 94 +++++++ 3 files changed, 392 insertions(+) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java create mode 100644 gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java new file mode 100644 index 000000000000..8abf335969f8 --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -0,0 +1,254 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.collect.ImmutableList; + +import java.util.LinkedList; +import java.util.List; + +/** + * A class that represents Google Cloud DNS record set. + * + *

+ * A unit of data that will be returned by the DNS servers. + * + * @see Google + * Cloud DNS documentation + */ +public class DnsRecord { + + private String name; + private List rrdatas = new LinkedList<>(); + private Integer ttl = 86400; // the default ttl of 24 hours + private DnsRecordType type; + private String parentName; + private Long parentId; + + /** + * A private constructor. Obtain an instance using {@link DnsRecord#Builder}. + */ + private DnsRecord() { + } + + DnsRecord(Builder builder) { + this.name = builder.name; + this.rrdatas = ImmutableList.copyOf(builder.rrdatas); + this.ttl = builder.ttl; + this.type = builder.type; + this.parentName = builder.parentName; + this.parentId = builder.parentId; + } + + /** + * Enum for the DNS record types supported by Cloud DNS. + * + *

+ * Google Cloud DNS currently supports records of type A, AAAA, CNAME, MX + * NAPTR, NS, PTR, SOA, SPF, SRV, TXT. + * + * @see + * Cloud + * DNS supported record types + */ + public enum DnsRecordType { + A("A"), + AAAA("AAAA"), + CNAME("CNAME"), + MX("MX"), + NAPTR("NAPTR"), + NS("NS"), + PTR("PTR"), + SOA("SOA"), + SPF("SPF"), + SRV("SRV"), + TXT("TXT"); + + private final String type; + + private DnsRecordType(String type) { + this.type = type; + } + } + + public static class Builder { + + private List rrdatas = new LinkedList<>(); + private String name; + private Integer ttl = 86400; // default ttl of 24 hours + private DnsRecordType type; + private String parentName; + private Long parentId; + + private Builder() { + } + + /** + * Creates a builder and pre-populates attributes with the values from the + * provided DnsRecord instance. + */ + public Builder(DnsRecord record) { + this.name = record.name; + this.ttl = record.ttl; + this.type = record.type; + this.parentId = record.parentId; + this.parentName = record.parentName; + this.rrdatas.addAll(record.rrdatas); + } + + /** + * Adds a record to the record set. + * + *

+ * The records should be as defined in RFC 1035 (section 5) and RFC 1034 + * (section 3.6.1). Examples of records are available in + * Cloud + * DNS documentation. + */ + public Builder add(String record) { + this.rrdatas.add(checkNotNull(record)); + return this; + } + + /** + * Sets name for this DNS record set. For example, www.example.com. + */ + public Builder name(String name) { + this.name = checkNotNull(name); + return this; + } + + /** + * Sets the number of seconds that this record can be cached by resolvers. + * This number must be non-negative. + * + * @param ttl A non-negative number of seconds + */ + public Builder ttl(int ttl) { + // change only if + if (ttl < 0) { + throw new IllegalArgumentException( + "TTL cannot be negative. The supplied value was " + ttl + "." + ); + } + this.ttl = ttl; + return this; + } + + /** + * The identifier of a supported record type, for example, A, AAAA, MX, TXT, + * and so on. + */ + public Builder type(DnsRecordType type) { + this.type = checkNotNull(type); + return this; + } + + /** + * Builds the DNS record. + */ + public DnsRecord build() { + return new DnsRecord(this); + } + + /** + * Sets references to the managed zone that this DNS record belongs to. + */ + public Builder managedZone(ManagedZoneInfo parent) { + checkNotNull(parent); + this.parentId = parent.id(); + this.parentName = parent.name(); + return this; + } + } + + /** + * Creates a builder pre-populated with the attribute values of this instance. + */ + public Builder toBuilder() { + return new Builder(this); + } + + /** + * Creates an empty builder + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Get user assigned name of this DNS record. + * + * TODO: is this field mandatory? + */ + public String name() { + return name; + } + + /** + * Returns a list of DNS record stored in this record set. + */ + public List rrdatas() { + return rrdatas; + } + + /** + * Returns the number of seconds that this ResourceRecordSet can be cached by + * resolvers. + * + *

+ * This number is provided by the user. If this values is not set, we use + * default of 86400. + */ + public Integer ttl() { + return ttl; + } + + /** + * Returns the type of this DNS record. + */ + public DnsRecordType type() { + return type; + } + + /** + * Returns name of the managed zone that this record belongs to. + * + *

+ * The name of the managed zone is provided by the user when the managed zone + * is created. It is unique within a project. If this DNS record is not + * associated with a managed zone, this returns null. + */ + public String parentName() { + return parentName; + } + + /** + * Returns name of the managed zone that this record belongs to. + * + *

+ * The id of the managed zone is determined by the server when the managed + * zone is created. It is a read only value. If this DNS record is not + * associated with a managed zone, or if the id of the managed zone was not + * loaded from the cloud service, this returns null. + */ + public Long parentId() { + return parentId; + } + +} diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java new file mode 100644 index 000000000000..003854a91918 --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java @@ -0,0 +1,44 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +/** + * TODO: Implement. + * TODO: Add documentation. + */ +public class ManagedZoneInfo { + + private final String name; + private final Long id; + + public String name() { + throw new UnsupportedOperationException("Not implemented yet."); + // TODO: Implement + } + + public Long id() { + return id; + // TODO: Implement + } + + private ManagedZoneInfo() { + name = null; + id = null; + throw new UnsupportedOperationException("Not implemented yet"); + // TODO: Implement + } + +} diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java new file mode 100644 index 000000000000..0709ca3bf0e4 --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -0,0 +1,94 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import org.easymock.EasyMock; + +import org.junit.Test; +import org.junit.Before; + +import static org.junit.Assert.*; + +public class DnsRecordTest { + + private static final String NAME = "example.com."; + private static final Integer TTL = 3600; + private static final DnsRecord.DnsRecordType TYPE = DnsRecord.DnsRecordType.AAAA; + private static final ManagedZoneInfo MANAGED_ZONE_INFO_MOCK + = EasyMock.createMock(ManagedZoneInfo.class); + private static final Long PARENT_ID = 12L; + private static final String PARENT_NAME = "name"; + static { + EasyMock.expect(MANAGED_ZONE_INFO_MOCK.id()).andReturn(PARENT_ID); + EasyMock.expect(MANAGED_ZONE_INFO_MOCK.name()).andReturn(PARENT_NAME); + EasyMock.replay(MANAGED_ZONE_INFO_MOCK); + } + private static final DnsRecord RECORD = DnsRecord.builder() + .name(NAME) + .ttl(TTL) + .managedZone(MANAGED_ZONE_INFO_MOCK) + .build(); + private static final Integer DEFAULT_TTL = 86400; + + @Test + public void testDefaultDnsRecord() { + DnsRecord record = DnsRecord.builder().build(); + assertEquals(DEFAULT_TTL, record.ttl()); + assertEquals(0, record.rrdatas().size()); + } + + @Test + public void testBuilder() { + + assertEquals(NAME, RECORD.name()); + assertEquals(TTL, RECORD.ttl()); + + assertEquals(PARENT_ID, RECORD.parentId()); // this was never assigned + assertEquals(PARENT_NAME, RECORD.parentName()); + assertEquals(0, RECORD.rrdatas().size()); + // verify that one can add records to the record set + String testingRecord = "Testing record"; + String anotherTestingRecord = "Another record 123"; + DnsRecord anotherRecord = RECORD.toBuilder() + .add(testingRecord) + .add(anotherTestingRecord) + .build(); + assertEquals(2, anotherRecord.rrdatas().size()); + assertTrue(anotherRecord.rrdatas().contains(testingRecord)); + assertTrue(anotherRecord.rrdatas().contains(anotherTestingRecord)); + } + + @Test + public void testValidTtl() { + try { + DnsRecord.builder().ttl(-1); + fail("A negative value is not acceptable for ttl."); + } catch (IllegalArgumentException e) { + // ok + } + try { + DnsRecord.builder().ttl(0); + } catch (IllegalArgumentException e) { + fail("0 is a valid value."); + } + try { + DnsRecord.builder().ttl(Integer.MAX_VALUE); + } catch (Exception e) { + fail("Large numbers should be ok too."); + } + } + +} From f652277e166b7d3cb3f248e0dafd92ea063c0caf Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Tue, 19 Jan 2016 15:37:51 -0800 Subject: [PATCH 03/50] Implemented comments by @mziccard --- .../java/com/google/gcloud/dns/DnsRecord.java | 188 ++++++++++-------- .../google/gcloud/dns/ManagedZoneInfo.java | 10 +- .../com/google/gcloud/dns/DnsRecordTest.java | 82 +++++--- 3 files changed, 165 insertions(+), 115 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index 8abf335969f8..56da63dc5fe3 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -15,35 +15,45 @@ */ package com.google.gcloud.dns; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.collect.ImmutableList; +import java.io.Serializable; + import java.util.LinkedList; import java.util.List; +import java.util.Objects; /** * A class that represents Google Cloud DNS record set. * - *

- * A unit of data that will be returned by the DNS servers. + *

A unit of data that will be returned by the DNS servers. * - * @see Google - * Cloud DNS documentation + * @see Google Cloud DNS + * documentation */ -public class DnsRecord { +public class DnsRecord implements Serializable { - private String name; - private List rrdatas = new LinkedList<>(); - private Integer ttl = 86400; // the default ttl of 24 hours - private DnsRecordType type; - private String parentName; - private Long parentId; + private static final long serialVersionUID = 2016011914302204L; + private final String name; + private final List rrdatas; + private final Integer ttl; + private final DnsRecordType type; + private final String zoneName; + private final Long zoneId; /** * A private constructor. Obtain an instance using {@link DnsRecord#Builder}. */ private DnsRecord() { + this.name = null; + this.rrdatas = null; + this.ttl = null; + this.type = null; + this.zoneName = null; + this.zoneId = null; } DnsRecord(Builder builder) { @@ -51,74 +61,64 @@ private DnsRecord() { this.rrdatas = ImmutableList.copyOf(builder.rrdatas); this.ttl = builder.ttl; this.type = builder.type; - this.parentName = builder.parentName; - this.parentId = builder.parentId; + this.zoneName = builder.zoneName; + this.zoneId = builder.zoneId; } /** * Enum for the DNS record types supported by Cloud DNS. * - *

- * Google Cloud DNS currently supports records of type A, AAAA, CNAME, MX - * NAPTR, NS, PTR, SOA, SPF, SRV, TXT. + *

Google Cloud DNS currently supports records of type A, AAAA, CNAME, MX NAPTR, NS, PTR, SOA, + * SPF, SRV, TXT. * - * @see - * Cloud - * DNS supported record types + * @see Cloud DNS + * supported record types */ public enum DnsRecordType { - A("A"), - AAAA("AAAA"), - CNAME("CNAME"), - MX("MX"), - NAPTR("NAPTR"), - NS("NS"), - PTR("PTR"), - SOA("SOA"), - SPF("SPF"), - SRV("SRV"), - TXT("TXT"); - - private final String type; - - private DnsRecordType(String type) { - this.type = type; - } + A, + AAAA, + CNAME, + MX, + NAPTR, + NS, + PTR, + SOA, + SPF, + SRV, + TXT; } public static class Builder { private List rrdatas = new LinkedList<>(); private String name; - private Integer ttl = 86400; // default ttl of 24 hours + private Integer ttl; private DnsRecordType type; - private String parentName; - private Long parentId; + private String zoneName; + private Long zoneId; private Builder() { } /** - * Creates a builder and pre-populates attributes with the values from the - * provided DnsRecord instance. + * Creates a builder and pre-populates attributes with the values from the provided DnsRecord + * instance. */ public Builder(DnsRecord record) { this.name = record.name; this.ttl = record.ttl; this.type = record.type; - this.parentId = record.parentId; - this.parentName = record.parentName; + this.zoneId = record.zoneId; + this.zoneName = record.zoneName; this.rrdatas.addAll(record.rrdatas); } /** - * Adds a record to the record set. + * Adds a record to the record set. The records should be as defined in RFC 1035 (section 5) and + * RFC 1034 (section 3.6.1). Examples of records are available in Google DNS documentation. * - *

- * The records should be as defined in RFC 1035 (section 5) and RFC 1034 - * (section 3.6.1). Examples of records are available in - * Cloud - * DNS documentation. + * @see Google + * DNS documentation . */ public Builder add(String record) { this.rrdatas.add(checkNotNull(record)); @@ -134,25 +134,19 @@ public Builder name(String name) { } /** - * Sets the number of seconds that this record can be cached by resolvers. - * This number must be non-negative. + * Sets the number of seconds that this record can be cached by resolvers. This number must be + * non-negative. * * @param ttl A non-negative number of seconds */ public Builder ttl(int ttl) { - // change only if - if (ttl < 0) { - throw new IllegalArgumentException( - "TTL cannot be negative. The supplied value was " + ttl + "." - ); - } + checkArgument(ttl >= 0, "TTL cannot be negative. The supplied value was " + ttl + "."); this.ttl = ttl; return this; } /** - * The identifier of a supported record type, for example, A, AAAA, MX, TXT, - * and so on. + * The identifier of a supported record type, for example, A, AAAA, MX, TXT, and so on. */ public Builder type(DnsRecordType type) { this.type = checkNotNull(type); @@ -171,8 +165,8 @@ public DnsRecord build() { */ public Builder managedZone(ManagedZoneInfo parent) { checkNotNull(parent); - this.parentId = parent.id(); - this.parentName = parent.name(); + this.zoneId = parent.id(); + this.zoneName = parent.name(); return this; } } @@ -192,9 +186,7 @@ public static Builder builder() { } /** - * Get user assigned name of this DNS record. - * - * TODO: is this field mandatory? + * Get the mandatory user assigned name of this DNS record. */ public String name() { return name; @@ -204,16 +196,12 @@ public String name() { * Returns a list of DNS record stored in this record set. */ public List rrdatas() { - return rrdatas; + return ImmutableList.copyOf(rrdatas); } /** - * Returns the number of seconds that this ResourceRecordSet can be cached by - * resolvers. - * - *

- * This number is provided by the user. If this values is not set, we use - * default of 86400. + * Returns the number of seconds that this ResourceRecordSet can be cached by resolvers. This + * number is provided by the user. */ public Integer ttl() { return ttl; @@ -227,28 +215,56 @@ public DnsRecordType type() { } /** - * Returns name of the managed zone that this record belongs to. - * - *

- * The name of the managed zone is provided by the user when the managed zone - * is created. It is unique within a project. If this DNS record is not - * associated with a managed zone, this returns null. + * Returns name of the managed zone that this record belongs to. The name of the managed zone is + * provided by the user when the managed zone is created. It is unique within a project. If this + * DNS record is not associated with a managed zone, this returns null. */ - public String parentName() { - return parentName; + public String zoneName() { + return zoneName; } /** * Returns name of the managed zone that this record belongs to. * - *

- * The id of the managed zone is determined by the server when the managed - * zone is created. It is a read only value. If this DNS record is not - * associated with a managed zone, or if the id of the managed zone was not - * loaded from the cloud service, this returns null. + *

The id of the managed zone is determined by the server when the managed zone is created. It + * is a read only value. If this DNS record is not associated with a managed zone, or if the id of + * the managed zone was not loaded from the cloud service, this returns null. */ - public Long parentId() { - return parentId; + public Long zoneId() { + return zoneId; + } + + @Override + public int hashCode() { + return Objects.hash(name, rrdatas, ttl, type, zoneName, zoneId); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DnsRecord) { + DnsRecord other = (DnsRecord) obj; + return zoneId == other.zoneId() + && zoneName == other.zoneName + && this.toRRSet().equals(other.toRRSet()); + } + return false; + } + + com.google.api.services.dns.model.ResourceRecordSet toRRSet() { + com.google.api.services.dns.model.ResourceRecordSet rrset = + new com.google.api.services.dns.model.ResourceRecordSet(); + rrset.setName(name); + rrset.setRrdatas(this.rrdatas()); + rrset.setTtl(ttl); + rrset.setType(type == null ? null : type.name()); + return rrset; + } + + @Override + public String toString() { + return "DnsRecord{" + "name=" + name + ", rrdatas=" + rrdatas + + ", ttl=" + ttl + ", type=" + type + ", zoneName=" + + zoneName + ", zoneId=" + zoneId + '}'; } } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java index 003854a91918..d5ed8351dc34 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java @@ -16,8 +16,8 @@ package com.google.gcloud.dns; /** - * TODO: Implement. - * TODO: Add documentation. + * todo(mderka): Implement. + * todo(mderka): Add documentation. */ public class ManagedZoneInfo { @@ -26,19 +26,19 @@ public class ManagedZoneInfo { public String name() { throw new UnsupportedOperationException("Not implemented yet."); - // TODO: Implement + // todo(mderka): Implement } public Long id() { return id; - // TODO: Implement + // todo(mderka): Implement } private ManagedZoneInfo() { name = null; id = null; throw new UnsupportedOperationException("Not implemented yet"); - // TODO: Implement + // todo(mderka): Implement } } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java index 0709ca3bf0e4..55c72d794e87 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -15,38 +15,42 @@ */ package com.google.gcloud.dns; -import org.easymock.EasyMock; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.junit.Assert.assertNotEquals; +import org.junit.BeforeClass; import org.junit.Test; -import org.junit.Before; -import static org.junit.Assert.*; +import org.easymock.EasyMock; + public class DnsRecordTest { private static final String NAME = "example.com."; private static final Integer TTL = 3600; private static final DnsRecord.DnsRecordType TYPE = DnsRecord.DnsRecordType.AAAA; - private static final ManagedZoneInfo MANAGED_ZONE_INFO_MOCK - = EasyMock.createMock(ManagedZoneInfo.class); - private static final Long PARENT_ID = 12L; - private static final String PARENT_NAME = "name"; + private static final ManagedZoneInfo MANAGED_ZONE_INFO_MOCK = + EasyMock.createMock(ManagedZoneInfo.class); + private static final Long ZONE_ID = 12L; + private static final String ZONE_NAME = "name"; + static { - EasyMock.expect(MANAGED_ZONE_INFO_MOCK.id()).andReturn(PARENT_ID); - EasyMock.expect(MANAGED_ZONE_INFO_MOCK.name()).andReturn(PARENT_NAME); + EasyMock.expect(MANAGED_ZONE_INFO_MOCK.id()).andReturn(ZONE_ID); + EasyMock.expect(MANAGED_ZONE_INFO_MOCK.name()).andReturn(ZONE_NAME); EasyMock.replay(MANAGED_ZONE_INFO_MOCK); } + private static final DnsRecord RECORD = DnsRecord.builder() .name(NAME) .ttl(TTL) .managedZone(MANAGED_ZONE_INFO_MOCK) .build(); - private static final Integer DEFAULT_TTL = 86400; @Test public void testDefaultDnsRecord() { DnsRecord record = DnsRecord.builder().build(); - assertEquals(DEFAULT_TTL, record.ttl()); assertEquals(0, record.rrdatas().size()); } @@ -56,8 +60,8 @@ public void testBuilder() { assertEquals(NAME, RECORD.name()); assertEquals(TTL, RECORD.ttl()); - assertEquals(PARENT_ID, RECORD.parentId()); // this was never assigned - assertEquals(PARENT_NAME, RECORD.parentName()); + assertEquals(ZONE_ID, RECORD.zoneId()); // this was never assigned + assertEquals(ZONE_NAME, RECORD.zoneName()); assertEquals(0, RECORD.rrdatas().size()); // verify that one can add records to the record set String testingRecord = "Testing record"; @@ -77,18 +81,48 @@ public void testValidTtl() { DnsRecord.builder().ttl(-1); fail("A negative value is not acceptable for ttl."); } catch (IllegalArgumentException e) { - // ok - } - try { - DnsRecord.builder().ttl(0); - } catch (IllegalArgumentException e) { - fail("0 is a valid value."); - } - try { - DnsRecord.builder().ttl(Integer.MAX_VALUE); - } catch (Exception e) { - fail("Large numbers should be ok too."); + // expected } + DnsRecord.builder().ttl(0); + DnsRecord.builder().ttl(Integer.MAX_VALUE); + } + + @Test + public void testEqualsAndNotEquals() { + DnsRecord clone = RECORD.toBuilder().build(); + assertEquals(clone, RECORD); + clone = RECORD.toBuilder().add("another record").build(); + final String differentName = "totally different name"; + clone = RECORD.toBuilder().name(differentName).build(); + assertNotEquals(clone, RECORD); + clone = RECORD.toBuilder().ttl(RECORD.ttl() + 1).build(); + assertNotEquals(clone, RECORD); + clone = RECORD.toBuilder().type(DnsRecord.DnsRecordType.TXT).build(); + assertNotEquals(clone, RECORD); + ManagedZoneInfo anotherMock = EasyMock.createMock(ManagedZoneInfo.class); + EasyMock.expect(anotherMock.id()).andReturn(ZONE_ID + 1); + EasyMock.expect(anotherMock.name()).andReturn(ZONE_NAME + "more text"); + EasyMock.replay(anotherMock); + clone = RECORD.toBuilder().managedZone(anotherMock).build(); + assertNotEquals(clone, RECORD); + } + + @Test + public void testSameHashCodeOnEquals() { + int hash = RECORD.hashCode(); + DnsRecord clone = RECORD.toBuilder().build(); + assertEquals(clone.hashCode(), hash); + } + + @Test + public void testDifferentHashCodeOnDifferent() { + int hash = RECORD.hashCode(); + final String differentName = "totally different name"; + DnsRecord clone = RECORD.toBuilder().name(differentName).build(); + assertNotEquals(differentName, RECORD.name()); + assertNotEquals(clone.hashCode(), hash); + DnsRecord anotherClone = RECORD.toBuilder().add("another record").build(); + assertNotEquals(anotherClone.hashCode(), hash); } } From b29945fd1fd920571d115b746185dfef36d2a0ab Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Wed, 20 Jan 2016 11:14:09 -0800 Subject: [PATCH 04/50] Second round of comments from @mziccard --- .../java/com/google/gcloud/dns/DnsRecord.java | 68 +++++++++------- .../com/google/gcloud/dns/DnsRecordTest.java | 78 ++++++++++--------- 2 files changed, 80 insertions(+), 66 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index 56da63dc5fe3..91278fa2a1e7 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -18,6 +18,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; import java.io.Serializable; @@ -29,7 +30,7 @@ /** * A class that represents Google Cloud DNS record set. * - *

A unit of data that will be returned by the DNS servers. + *

A unit of data that will be returned by the DNS servers. * * @see Google Cloud DNS * documentation @@ -44,9 +45,6 @@ public class DnsRecord implements Serializable { private final String zoneName; private final Long zoneId; - /** - * A private constructor. Obtain an instance using {@link DnsRecord#Builder}. - */ private DnsRecord() { this.name = null; this.rrdatas = null; @@ -68,7 +66,7 @@ private DnsRecord() { /** * Enum for the DNS record types supported by Cloud DNS. * - *

Google Cloud DNS currently supports records of type A, AAAA, CNAME, MX NAPTR, NS, PTR, SOA, + *

Google Cloud DNS currently supports records of type A, AAAA, CNAME, MX NAPTR, NS, PTR, SOA, * SPF, SRV, TXT. * * @see Cloud DNS @@ -85,7 +83,7 @@ public enum DnsRecordType { SOA, SPF, SRV, - TXT; + TXT } public static class Builder { @@ -162,13 +160,23 @@ public DnsRecord build() { /** * Sets references to the managed zone that this DNS record belongs to. + * + * todo(mderka): consider if this method is needed; may not be possible when listing records */ - public Builder managedZone(ManagedZoneInfo parent) { + Builder managedZone(ManagedZoneInfo parent) { checkNotNull(parent); this.zoneId = parent.id(); this.zoneName = parent.name(); return this; } + + /** + * Sets name reference to the managed zone that this DNS record belongs to. + */ + Builder managedZone(String managedZoneName) { + this.zoneName = checkNotNull(managedZoneName); + return this; + } } /** @@ -196,12 +204,12 @@ public String name() { * Returns a list of DNS record stored in this record set. */ public List rrdatas() { - return ImmutableList.copyOf(rrdatas); + return rrdatas; } /** - * Returns the number of seconds that this ResourceRecordSet can be cached by resolvers. This - * number is provided by the user. + * Returns the number of seconds that this DnsResource can be cached by resolvers. This number is + * provided by the user. */ public Integer ttl() { return ttl; @@ -224,9 +232,9 @@ public String zoneName() { } /** - * Returns name of the managed zone that this record belongs to. + * Returns id of the managed zone that this record belongs to. * - *

The id of the managed zone is determined by the server when the managed zone is created. It + *

The id of the managed zone is determined by the server when the managed zone is created. It * is a read only value. If this DNS record is not associated with a managed zone, or if the id of * the managed zone was not loaded from the cloud service, this returns null. */ @@ -241,30 +249,32 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (obj instanceof DnsRecord) { - DnsRecord other = (DnsRecord) obj; - return zoneId == other.zoneId() - && zoneName == other.zoneName - && this.toRRSet().equals(other.toRRSet()); - } - return false; + return (obj instanceof DnsRecord) && Objects.equals(this.toPb(), ((DnsRecord) obj).toPb()) + && this.zoneId().equals(((DnsRecord) obj).zoneId()) + && this.zoneName().equals(((DnsRecord) obj).zoneName()); + } - com.google.api.services.dns.model.ResourceRecordSet toRRSet() { - com.google.api.services.dns.model.ResourceRecordSet rrset = + com.google.api.services.dns.model.ResourceRecordSet toPb() { + com.google.api.services.dns.model.ResourceRecordSet pb = new com.google.api.services.dns.model.ResourceRecordSet(); - rrset.setName(name); - rrset.setRrdatas(this.rrdatas()); - rrset.setTtl(ttl); - rrset.setType(type == null ? null : type.name()); - return rrset; + pb.setName(this.name()); + pb.setRrdatas(this.rrdatas()); + pb.setTtl(this.ttl()); + pb.setType(this.type() == null ? null : this.type().name()); + return pb; } @Override public String toString() { - return "DnsRecord{" + "name=" + name + ", rrdatas=" + rrdatas - + ", ttl=" + ttl + ", type=" + type + ", zoneName=" - + zoneName + ", zoneId=" + zoneId + '}'; + return MoreObjects.toStringHelper(this) + .add("name", name()) + .add("rrdatas", rrdatas()) + .add("ttl", ttl()) + .add("type", type()) + .add("zoneName", zoneName()) + .add("zoneId", zoneId()) + .toString(); } } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java index 55c72d794e87..ee9e6e58d61d 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -25,29 +25,30 @@ import org.easymock.EasyMock; - public class DnsRecordTest { private static final String NAME = "example.com."; private static final Integer TTL = 3600; private static final DnsRecord.DnsRecordType TYPE = DnsRecord.DnsRecordType.AAAA; - private static final ManagedZoneInfo MANAGED_ZONE_INFO_MOCK = - EasyMock.createMock(ManagedZoneInfo.class); private static final Long ZONE_ID = 12L; private static final String ZONE_NAME = "name"; - - static { - EasyMock.expect(MANAGED_ZONE_INFO_MOCK.id()).andReturn(ZONE_ID); - EasyMock.expect(MANAGED_ZONE_INFO_MOCK.name()).andReturn(ZONE_NAME); - EasyMock.replay(MANAGED_ZONE_INFO_MOCK); + // the following is initialized in @BeforeClass setUp() + private static DnsRecord record; + private static ManagedZoneInfo managedZoneInfoMock; + + @BeforeClass + public static void setUp() { + managedZoneInfoMock = EasyMock.createMock(ManagedZoneInfo.class); + EasyMock.expect(managedZoneInfoMock.id()).andReturn(ZONE_ID); + EasyMock.expect(managedZoneInfoMock.name()).andReturn(ZONE_NAME); + EasyMock.replay(managedZoneInfoMock); + record = DnsRecord.builder() + .name(NAME) + .ttl(TTL) + .managedZone(managedZoneInfoMock) + .build(); } - private static final DnsRecord RECORD = DnsRecord.builder() - .name(NAME) - .ttl(TTL) - .managedZone(MANAGED_ZONE_INFO_MOCK) - .build(); - @Test public void testDefaultDnsRecord() { DnsRecord record = DnsRecord.builder().build(); @@ -57,20 +58,23 @@ public void testDefaultDnsRecord() { @Test public void testBuilder() { - assertEquals(NAME, RECORD.name()); - assertEquals(TTL, RECORD.ttl()); + assertEquals(NAME, record.name()); + assertEquals(TTL, record.ttl()); - assertEquals(ZONE_ID, RECORD.zoneId()); // this was never assigned - assertEquals(ZONE_NAME, RECORD.zoneName()); - assertEquals(0, RECORD.rrdatas().size()); + assertEquals(ZONE_ID, record.zoneId()); // this was never assigned + assertEquals(ZONE_NAME, record.zoneName()); + assertEquals(0, record.rrdatas().size()); // verify that one can add records to the record set String testingRecord = "Testing record"; String anotherTestingRecord = "Another record 123"; - DnsRecord anotherRecord = RECORD.toBuilder() + String differentName = ZONE_NAME + "something"; + DnsRecord anotherRecord = record.toBuilder() .add(testingRecord) .add(anotherTestingRecord) + .managedZone(differentName) .build(); assertEquals(2, anotherRecord.rrdatas().size()); + assertEquals(differentName, anotherRecord.zoneName()); assertTrue(anotherRecord.rrdatas().contains(testingRecord)); assertTrue(anotherRecord.rrdatas().contains(anotherTestingRecord)); } @@ -89,39 +93,39 @@ public void testValidTtl() { @Test public void testEqualsAndNotEquals() { - DnsRecord clone = RECORD.toBuilder().build(); - assertEquals(clone, RECORD); - clone = RECORD.toBuilder().add("another record").build(); + DnsRecord clone = record.toBuilder().build(); + assertEquals(clone, record); + clone = record.toBuilder().add("another record").build(); final String differentName = "totally different name"; - clone = RECORD.toBuilder().name(differentName).build(); - assertNotEquals(clone, RECORD); - clone = RECORD.toBuilder().ttl(RECORD.ttl() + 1).build(); - assertNotEquals(clone, RECORD); - clone = RECORD.toBuilder().type(DnsRecord.DnsRecordType.TXT).build(); - assertNotEquals(clone, RECORD); + clone = record.toBuilder().name(differentName).build(); + assertNotEquals(clone, record); + clone = record.toBuilder().ttl(record.ttl() + 1).build(); + assertNotEquals(clone, record); + clone = record.toBuilder().type(DnsRecord.DnsRecordType.TXT).build(); + assertNotEquals(clone, record); ManagedZoneInfo anotherMock = EasyMock.createMock(ManagedZoneInfo.class); EasyMock.expect(anotherMock.id()).andReturn(ZONE_ID + 1); EasyMock.expect(anotherMock.name()).andReturn(ZONE_NAME + "more text"); EasyMock.replay(anotherMock); - clone = RECORD.toBuilder().managedZone(anotherMock).build(); - assertNotEquals(clone, RECORD); + clone = record.toBuilder().managedZone(anotherMock).build(); + assertNotEquals(clone, record); } @Test public void testSameHashCodeOnEquals() { - int hash = RECORD.hashCode(); - DnsRecord clone = RECORD.toBuilder().build(); + int hash = record.hashCode(); + DnsRecord clone = record.toBuilder().build(); assertEquals(clone.hashCode(), hash); } @Test public void testDifferentHashCodeOnDifferent() { - int hash = RECORD.hashCode(); + int hash = record.hashCode(); final String differentName = "totally different name"; - DnsRecord clone = RECORD.toBuilder().name(differentName).build(); - assertNotEquals(differentName, RECORD.name()); + DnsRecord clone = record.toBuilder().name(differentName).build(); + assertNotEquals(differentName, record.name()); assertNotEquals(clone.hashCode(), hash); - DnsRecord anotherClone = RECORD.toBuilder().add("another record").build(); + DnsRecord anotherClone = record.toBuilder().add("another record").build(); assertNotEquals(anotherClone.hashCode(), hash); } From 1fc0e3275e352706734dc935c6d4bab77976fb1c Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Wed, 20 Jan 2016 17:55:43 -0800 Subject: [PATCH 05/50] Implemented comments by @aozarov. Also removed incomplete ManagedZoneInfo.java. --- .../java/com/google/gcloud/dns/DnsRecord.java | 170 ++++++++++-------- .../google/gcloud/dns/ManagedZoneInfo.java | 44 ----- .../com/google/gcloud/dns/DnsRecordTest.java | 68 ++----- 3 files changed, 105 insertions(+), 177 deletions(-) delete mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index 91278fa2a1e7..9cc21acfa0a5 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.google.gcloud.dns; import static com.google.common.base.Preconditions.checkArgument; @@ -20,6 +21,7 @@ import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import java.io.Serializable; @@ -30,7 +32,10 @@ /** * A class that represents Google Cloud DNS record set. * - *

A unit of data that will be returned by the DNS servers. + *

A DnsRecord is the unit of data that will be returned by the DNS servers upon a DNS request + * for a specific domain. The DnsRecord holds the current state of the DNS records that make up a + * managed zone. You can read the records but you do not modify them directly. Rather, you edit + * the records in a managed zone by creating a {@link ChangeRequest}. * * @see Google Cloud DNS * documentation @@ -42,26 +47,6 @@ public class DnsRecord implements Serializable { private final List rrdatas; private final Integer ttl; private final DnsRecordType type; - private final String zoneName; - private final Long zoneId; - - private DnsRecord() { - this.name = null; - this.rrdatas = null; - this.ttl = null; - this.type = null; - this.zoneName = null; - this.zoneId = null; - } - - DnsRecord(Builder builder) { - this.name = builder.name; - this.rrdatas = ImmutableList.copyOf(builder.rrdatas); - this.ttl = builder.ttl; - this.type = builder.type; - this.zoneName = builder.zoneName; - this.zoneId = builder.zoneId; - } /** * Enum for the DNS record types supported by Cloud DNS. @@ -73,16 +58,51 @@ private DnsRecord() { * supported record types */ public enum DnsRecordType { + /** + * Address record, which is used to map host names to their IPv4 address. + */ A, + /** + * IPv6 Address record, which is used to map host names to their IPv6 address. + */ AAAA, + /** + * Canonical name record, which is used to alias names. + */ CNAME, + /** + * Mail exchange record, which is used in routing requests to mail servers. + */ MX, + /** + * Naming authority pointer record, defined by RFC3403. + */ NAPTR, + /** + * Name server record, which delegates a DNS zone to an authoritative server. + */ NS, + /** + * Pointer record, which is often used for reverse DNS lookups. + */ PTR, + /** + * Start of authority record, which specifies authoritative information about a DNS zone. + */ SOA, + /** + * Sender policy framework record, which is used in email validation systems. + */ SPF, + /** + * Service locator record, which is used by some voice over IP, instant messaging protocols and + * other applications. + */ SRV, + /** + * Text record, which can contain arbitrary text and can also be used to define machine readable + * data such as security or abuse prevention information. + */ TXT } @@ -92,8 +112,6 @@ public static class Builder { private String name; private Integer ttl; private DnsRecordType type; - private String zoneName; - private Long zoneId; private Builder() { } @@ -102,12 +120,10 @@ private Builder() { * Creates a builder and pre-populates attributes with the values from the provided DnsRecord * instance. */ - public Builder(DnsRecord record) { + private Builder(DnsRecord record) { this.name = record.name; this.ttl = record.ttl; this.type = record.type; - this.zoneId = record.zoneId; - this.zoneName = record.zoneName; this.rrdatas.addAll(record.rrdatas); } @@ -118,11 +134,46 @@ public Builder(DnsRecord record) { * @see Google * DNS documentation . */ - public Builder add(String record) { + public Builder addRecord(String record) { this.rrdatas.add(checkNotNull(record)); return this; } + /** + * Removes a record from the set. An exact match is required. + */ + public Builder removerRecord(String record) { + this.rrdatas.remove(checkNotNull(record)); + return this; + } + + /** + * Removes a record on the given index from the set. + */ + public Builder removerRecord(int index) { + checkArgument(index >= 0 && index < this.rrdatas.size(), "The index is out of bounds. An " + + "integer between 0 and " + (this.rrdatas.size() - 1) + " is required. The provided " + + "value was " + index + "."); + this.rrdatas.remove(index); + return this; + } + + /** + * Removes all the records. + */ + public Builder clearRecords() { + this.rrdatas.clear(); + return this; + } + + /** + * Replaces the current records with the provided list of records. + */ + public Builder records(List records) { + this.rrdatas = Lists.newLinkedList(checkNotNull(records)); + return this; + } + /** * Sets name for this DNS record set. For example, www.example.com. */ @@ -157,26 +208,13 @@ public Builder type(DnsRecordType type) { public DnsRecord build() { return new DnsRecord(this); } + } - /** - * Sets references to the managed zone that this DNS record belongs to. - * - * todo(mderka): consider if this method is needed; may not be possible when listing records - */ - Builder managedZone(ManagedZoneInfo parent) { - checkNotNull(parent); - this.zoneId = parent.id(); - this.zoneName = parent.name(); - return this; - } - - /** - * Sets name reference to the managed zone that this DNS record belongs to. - */ - Builder managedZone(String managedZoneName) { - this.zoneName = checkNotNull(managedZoneName); - return this; - } + DnsRecord(Builder builder) { + this.name = builder.name; + this.rrdatas = ImmutableList.copyOf(builder.rrdatas); + this.ttl = builder.ttl; + this.type = builder.type; } /** @@ -187,7 +225,7 @@ public Builder toBuilder() { } /** - * Creates an empty builder + * Creates an empty builder. */ public static Builder builder() { return new Builder(); @@ -203,13 +241,12 @@ public String name() { /** * Returns a list of DNS record stored in this record set. */ - public List rrdatas() { + public List records() { return rrdatas; } /** - * Returns the number of seconds that this DnsResource can be cached by resolvers. This number is - * provided by the user. + * Returns the number of seconds that this DnsResource can be cached by resolvers. */ public Integer ttl() { return ttl; @@ -222,44 +259,21 @@ public DnsRecordType type() { return type; } - /** - * Returns name of the managed zone that this record belongs to. The name of the managed zone is - * provided by the user when the managed zone is created. It is unique within a project. If this - * DNS record is not associated with a managed zone, this returns null. - */ - public String zoneName() { - return zoneName; - } - - /** - * Returns id of the managed zone that this record belongs to. - * - *

The id of the managed zone is determined by the server when the managed zone is created. It - * is a read only value. If this DNS record is not associated with a managed zone, or if the id of - * the managed zone was not loaded from the cloud service, this returns null. - */ - public Long zoneId() { - return zoneId; - } - @Override public int hashCode() { - return Objects.hash(name, rrdatas, ttl, type, zoneName, zoneId); + return Objects.hash(name, rrdatas, ttl, type); } @Override public boolean equals(Object obj) { - return (obj instanceof DnsRecord) && Objects.equals(this.toPb(), ((DnsRecord) obj).toPb()) - && this.zoneId().equals(((DnsRecord) obj).zoneId()) - && this.zoneName().equals(((DnsRecord) obj).zoneName()); - + return (obj instanceof DnsRecord) && Objects.equals(this.toPb(), ((DnsRecord) obj).toPb()); } com.google.api.services.dns.model.ResourceRecordSet toPb() { com.google.api.services.dns.model.ResourceRecordSet pb = new com.google.api.services.dns.model.ResourceRecordSet(); pb.setName(this.name()); - pb.setRrdatas(this.rrdatas()); + pb.setRrdatas(this.records()); pb.setTtl(this.ttl()); pb.setType(this.type() == null ? null : this.type().name()); return pb; @@ -269,11 +283,9 @@ com.google.api.services.dns.model.ResourceRecordSet toPb() { public String toString() { return MoreObjects.toStringHelper(this) .add("name", name()) - .add("rrdatas", rrdatas()) + .add("rrdatas", records()) .add("ttl", ttl()) .add("type", type()) - .add("zoneName", zoneName()) - .add("zoneId", zoneId()) .toString(); } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java deleted file mode 100644 index d5ed8351dc34..000000000000 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed 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 com.google.gcloud.dns; - -/** - * todo(mderka): Implement. - * todo(mderka): Add documentation. - */ -public class ManagedZoneInfo { - - private final String name; - private final Long id; - - public String name() { - throw new UnsupportedOperationException("Not implemented yet."); - // todo(mderka): Implement - } - - public Long id() { - return id; - // todo(mderka): Implement - } - - private ManagedZoneInfo() { - name = null; - id = null; - throw new UnsupportedOperationException("Not implemented yet"); - // todo(mderka): Implement - } - -} diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java index ee9e6e58d61d..4c03306ffb02 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -20,63 +20,40 @@ import static org.junit.Assert.fail; import static org.junit.Assert.assertNotEquals; -import org.junit.BeforeClass; import org.junit.Test; -import org.easymock.EasyMock; - public class DnsRecordTest { private static final String NAME = "example.com."; private static final Integer TTL = 3600; private static final DnsRecord.DnsRecordType TYPE = DnsRecord.DnsRecordType.AAAA; - private static final Long ZONE_ID = 12L; - private static final String ZONE_NAME = "name"; - // the following is initialized in @BeforeClass setUp() - private static DnsRecord record; - private static ManagedZoneInfo managedZoneInfoMock; - - @BeforeClass - public static void setUp() { - managedZoneInfoMock = EasyMock.createMock(ManagedZoneInfo.class); - EasyMock.expect(managedZoneInfoMock.id()).andReturn(ZONE_ID); - EasyMock.expect(managedZoneInfoMock.name()).andReturn(ZONE_NAME); - EasyMock.replay(managedZoneInfoMock); - record = DnsRecord.builder() - .name(NAME) - .ttl(TTL) - .managedZone(managedZoneInfoMock) - .build(); - } + private static final DnsRecord record = DnsRecord.builder() + .name(NAME) + .ttl(TTL) + .type(TYPE) + .build(); @Test public void testDefaultDnsRecord() { DnsRecord record = DnsRecord.builder().build(); - assertEquals(0, record.rrdatas().size()); + assertEquals(0, record.records().size()); } @Test public void testBuilder() { - assertEquals(NAME, record.name()); assertEquals(TTL, record.ttl()); - - assertEquals(ZONE_ID, record.zoneId()); // this was never assigned - assertEquals(ZONE_NAME, record.zoneName()); - assertEquals(0, record.rrdatas().size()); + assertEquals(0, record.records().size()); // verify that one can add records to the record set String testingRecord = "Testing record"; String anotherTestingRecord = "Another record 123"; - String differentName = ZONE_NAME + "something"; DnsRecord anotherRecord = record.toBuilder() - .add(testingRecord) - .add(anotherTestingRecord) - .managedZone(differentName) + .addRecord(testingRecord) + .addRecord(anotherTestingRecord) .build(); - assertEquals(2, anotherRecord.rrdatas().size()); - assertEquals(differentName, anotherRecord.zoneName()); - assertTrue(anotherRecord.rrdatas().contains(testingRecord)); - assertTrue(anotherRecord.rrdatas().contains(anotherTestingRecord)); + assertEquals(2, anotherRecord.records().size()); + assertTrue(anotherRecord.records().contains(testingRecord)); + assertTrue(anotherRecord.records().contains(anotherTestingRecord)); } @Test @@ -95,7 +72,8 @@ public void testValidTtl() { public void testEqualsAndNotEquals() { DnsRecord clone = record.toBuilder().build(); assertEquals(clone, record); - clone = record.toBuilder().add("another record").build(); + clone = record.toBuilder().addRecord("another record").build(); + assertNotEquals(clone, record); final String differentName = "totally different name"; clone = record.toBuilder().name(differentName).build(); assertNotEquals(clone, record); @@ -103,12 +81,6 @@ public void testEqualsAndNotEquals() { assertNotEquals(clone, record); clone = record.toBuilder().type(DnsRecord.DnsRecordType.TXT).build(); assertNotEquals(clone, record); - ManagedZoneInfo anotherMock = EasyMock.createMock(ManagedZoneInfo.class); - EasyMock.expect(anotherMock.id()).andReturn(ZONE_ID + 1); - EasyMock.expect(anotherMock.name()).andReturn(ZONE_NAME + "more text"); - EasyMock.replay(anotherMock); - clone = record.toBuilder().managedZone(anotherMock).build(); - assertNotEquals(clone, record); } @Test @@ -117,16 +89,4 @@ public void testSameHashCodeOnEquals() { DnsRecord clone = record.toBuilder().build(); assertEquals(clone.hashCode(), hash); } - - @Test - public void testDifferentHashCodeOnDifferent() { - int hash = record.hashCode(); - final String differentName = "totally different name"; - DnsRecord clone = record.toBuilder().name(differentName).build(); - assertNotEquals(differentName, record.name()); - assertNotEquals(clone.hashCode(), hash); - DnsRecord anotherClone = record.toBuilder().add("another record").build(); - assertNotEquals(anotherClone.hashCode(), hash); - } - } From 01662be5e9f6bf11496d84b909676f97ca0401b9 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 21 Jan 2016 10:00:41 -0800 Subject: [PATCH 06/50] Implements comments by @ajkannan --- gcloud-java-dns/pom.xml | 12 +++--- .../java/com/google/gcloud/dns/DnsRecord.java | 37 ++++++++++++------- .../com/google/gcloud/dns/DnsRecordTest.java | 36 ++++++++++++++---- pom.xml | 1 + 4 files changed, 59 insertions(+), 27 deletions(-) diff --git a/gcloud-java-dns/pom.xml b/gcloud-java-dns/pom.xml index 55d720bc0a36..5f04f261d500 100644 --- a/gcloud-java-dns/pom.xml +++ b/gcloud-java-dns/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 com.google.gcloud gcloud-java-dns @@ -28,10 +30,10 @@ v1-rev7-1.21.0 compile - - com.google.guava - guava-jdk5 - + + com.google.guava + guava-jdk5 + com.google.api-client google-api-client diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index 9cc21acfa0a5..f73c880f22f3 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -24,18 +24,17 @@ import com.google.common.collect.Lists; import java.io.Serializable; - import java.util.LinkedList; import java.util.List; import java.util.Objects; /** - * A class that represents Google Cloud DNS record set. + * A class that represents a Google Cloud DNS record set. * - *

A DnsRecord is the unit of data that will be returned by the DNS servers upon a DNS request - * for a specific domain. The DnsRecord holds the current state of the DNS records that make up a - * managed zone. You can read the records but you do not modify them directly. Rather, you edit - * the records in a managed zone by creating a {@link ChangeRequest}. + *

A {@code DnsRecord} is the unit of data that will be returned by the DNS servers upon a DNS + * request for a specific domain. The {@code DnsRecord} holds the current state of the DNS records + * that make up a managed zone. You can read the records but you do not modify them directly. + * Rather, you edit the records in a managed zone by creating a ChangeRequest. * * @see Google Cloud DNS * documentation @@ -117,8 +116,8 @@ private Builder() { } /** - * Creates a builder and pre-populates attributes with the values from the provided DnsRecord - * instance. + * Creates a builder and pre-populates attributes with the values from the provided {@code + * DnsRecord} instance. */ private Builder(DnsRecord record) { this.name = record.name; @@ -142,7 +141,7 @@ public Builder addRecord(String record) { /** * Removes a record from the set. An exact match is required. */ - public Builder removerRecord(String record) { + public Builder removeRecord(String record) { this.rrdatas.remove(checkNotNull(record)); return this; } @@ -150,7 +149,7 @@ public Builder removerRecord(String record) { /** * Removes a record on the given index from the set. */ - public Builder removerRecord(int index) { + public Builder removeRecord(int index) { checkArgument(index >= 0 && index < this.rrdatas.size(), "The index is out of bounds. An " + "integer between 0 and " + (this.rrdatas.size() - 1) + " is required. The provided " + "value was " + index + "."); @@ -225,10 +224,10 @@ public Builder toBuilder() { } /** - * Creates an empty builder. + * Creates a builder for {@code DnsRecord} with mandatorily set name and type of the record. */ - public static Builder builder() { - return new Builder(); + public static Builder builder(String name, DnsRecordType type) { + return new Builder().name(name).type(type); } /** @@ -279,6 +278,17 @@ com.google.api.services.dns.model.ResourceRecordSet toPb() { return pb; } + static DnsRecord fromPb(com.google.api.services.dns.model.ResourceRecordSet pb) { + Builder b = builder(pb.getName(), DnsRecordType.valueOf(pb.getType())); + if (pb.getRrdatas() != null) { + b.records(pb.getRrdatas()); + } + if (pb.getTtl() != null) { + b.ttl(pb.getTtl()); + } + return b.build(); + } + @Override public String toString() { return MoreObjects.toStringHelper(this) @@ -288,5 +298,4 @@ public String toString() { .add("type", type()) .toString(); } - } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java index 4c03306ffb02..e5b283a20acc 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -27,15 +27,13 @@ public class DnsRecordTest { private static final String NAME = "example.com."; private static final Integer TTL = 3600; private static final DnsRecord.DnsRecordType TYPE = DnsRecord.DnsRecordType.AAAA; - private static final DnsRecord record = DnsRecord.builder() - .name(NAME) + private static final DnsRecord record = DnsRecord.builder(NAME, TYPE) .ttl(TTL) - .type(TYPE) .build(); @Test public void testDefaultDnsRecord() { - DnsRecord record = DnsRecord.builder().build(); + DnsRecord record = DnsRecord.builder(NAME, TYPE).build(); assertEquals(0, record.records().size()); } @@ -59,13 +57,13 @@ public void testBuilder() { @Test public void testValidTtl() { try { - DnsRecord.builder().ttl(-1); + DnsRecord.builder(NAME, TYPE).ttl(-1); fail("A negative value is not acceptable for ttl."); } catch (IllegalArgumentException e) { // expected } - DnsRecord.builder().ttl(0); - DnsRecord.builder().ttl(Integer.MAX_VALUE); + DnsRecord.builder(NAME, TYPE).ttl(0); + DnsRecord.builder(NAME, TYPE).ttl(Integer.MAX_VALUE); } @Test @@ -89,4 +87,26 @@ public void testSameHashCodeOnEquals() { DnsRecord clone = record.toBuilder().build(); assertEquals(clone.hashCode(), hash); } -} + + @Test + public void testToAndFromPb() { + assertEquals(record, DnsRecord.fromPb(record.toPb())); + DnsRecord partial = DnsRecord.builder(NAME, TYPE).build(); + assertEquals(partial, DnsRecord.fromPb(partial.toPb())); + partial = DnsRecord.builder(NAME, TYPE).addRecord("test").build(); + assertEquals(partial, DnsRecord.fromPb(partial.toPb())); + partial = DnsRecord.builder(NAME, TYPE).ttl(15).build(); + assertEquals(partial, DnsRecord.fromPb(partial.toPb())); + } + + @Test + public void testToBuilder() { + assertEquals(record, record.toBuilder().build()); + DnsRecord partial = DnsRecord.builder(NAME, TYPE).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = DnsRecord.builder(NAME, TYPE).addRecord("test").build(); + assertEquals(partial, partial.toBuilder().build()); + partial = DnsRecord.builder(NAME, TYPE).ttl(15).build(); + assertEquals(partial, partial.toBuilder().build()); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index cd5c19720cd8..7a435cc1dbae 100644 --- a/pom.xml +++ b/pom.xml @@ -70,6 +70,7 @@ gcloud-java-bigquery gcloud-java-core gcloud-java-datastore + gcloud-java-dns gcloud-java-examples gcloud-java-resourcemanager gcloud-java-storage From 1c657158857a343c2ad4c761cb287d535f396704 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 21 Jan 2016 13:44:40 -0800 Subject: [PATCH 07/50] Removed the method for removing a record by index. --- .../main/java/com/google/gcloud/dns/DnsRecord.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index f73c880f22f3..41a8569d3937 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -146,17 +146,6 @@ public Builder removeRecord(String record) { return this; } - /** - * Removes a record on the given index from the set. - */ - public Builder removeRecord(int index) { - checkArgument(index >= 0 && index < this.rrdatas.size(), "The index is out of bounds. An " + - "integer between 0 and " + (this.rrdatas.size() - 1) + " is required. The provided " + - "value was " + index + "."); - this.rrdatas.remove(index); - return this; - } - /** * Removes all the records. */ From f994057f1d2e8bf4f6b1196d4ae578ba3321951b Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Fri, 22 Jan 2016 10:17:34 -0800 Subject: [PATCH 08/50] Another round of comments from @aozarov. --- .../java/com/google/gcloud/dns/DnsRecord.java | 47 ++++++++++--------- .../com/google/gcloud/dns/DnsRecordTest.java | 41 ++++++++++++---- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index 41a8569d3937..c41e72a77400 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -33,7 +33,7 @@ * *

A {@code DnsRecord} is the unit of data that will be returned by the DNS servers upon a DNS * request for a specific domain. The {@code DnsRecord} holds the current state of the DNS records - * that make up a managed zone. You can read the records but you do not modify them directly. + * that make up a managed zone. You can read the records but you cannot modify them directly. * Rather, you edit the records in a managed zone by creating a ChangeRequest. * * @see Google Cloud DNS @@ -45,7 +45,7 @@ public class DnsRecord implements Serializable { private final String name; private final List rrdatas; private final Integer ttl; - private final DnsRecordType type; + private final Type type; /** * Enum for the DNS record types supported by Cloud DNS. @@ -56,7 +56,7 @@ public class DnsRecord implements Serializable { * @see Cloud DNS * supported record types */ - public enum DnsRecordType { + public enum Type { /** * Address record, which is used to map host names to their IPv4 address. */ @@ -105,14 +105,19 @@ public enum DnsRecordType { TXT } + /** + * A builder of {@link DnsRecord}. + */ public static class Builder { private List rrdatas = new LinkedList<>(); private String name; private Integer ttl; - private DnsRecordType type; + private Type type; - private Builder() { + private Builder(String name, Type type) { + this.name = checkNotNull(name); + this.type = checkNotNull(type); } /** @@ -177,7 +182,7 @@ public Builder name(String name) { * @param ttl A non-negative number of seconds */ public Builder ttl(int ttl) { - checkArgument(ttl >= 0, "TTL cannot be negative. The supplied value was " + ttl + "."); + checkArgument(ttl >= 0, "TTL cannot be negative. The supplied value was %s.", ttl); this.ttl = ttl; return this; } @@ -185,7 +190,7 @@ public Builder ttl(int ttl) { /** * The identifier of a supported record type, for example, A, AAAA, MX, TXT, and so on. */ - public Builder type(DnsRecordType type) { + public Builder type(Type type) { this.type = checkNotNull(type); return this; } @@ -198,7 +203,7 @@ public DnsRecord build() { } } - DnsRecord(Builder builder) { + private DnsRecord(Builder builder) { this.name = builder.name; this.rrdatas = ImmutableList.copyOf(builder.rrdatas); this.ttl = builder.ttl; @@ -213,14 +218,14 @@ public Builder toBuilder() { } /** - * Creates a builder for {@code DnsRecord} with mandatorily set name and type of the record. + * Creates a {@code DnsRecord} builder for the given {@code name} and {@code type}. */ - public static Builder builder(String name, DnsRecordType type) { - return new Builder().name(name).type(type); + public static Builder builder(String name, Type type) { + return new Builder(name, type); } /** - * Get the mandatory user assigned name of this DNS record. + * Returns the user-assigned name of this DNS record. */ public String name() { return name; @@ -243,7 +248,7 @@ public Integer ttl() { /** * Returns the type of this DNS record. */ - public DnsRecordType type() { + public Type type() { return type; } @@ -259,16 +264,16 @@ public boolean equals(Object obj) { com.google.api.services.dns.model.ResourceRecordSet toPb() { com.google.api.services.dns.model.ResourceRecordSet pb = - new com.google.api.services.dns.model.ResourceRecordSet(); + new com.google.api.services.dns.model.ResourceRecordSet(); pb.setName(this.name()); pb.setRrdatas(this.records()); pb.setTtl(this.ttl()); - pb.setType(this.type() == null ? null : this.type().name()); + pb.setType(this.type().name()); return pb; } static DnsRecord fromPb(com.google.api.services.dns.model.ResourceRecordSet pb) { - Builder b = builder(pb.getName(), DnsRecordType.valueOf(pb.getType())); + Builder b = builder(pb.getName(), Type.valueOf(pb.getType())); if (pb.getRrdatas() != null) { b.records(pb.getRrdatas()); } @@ -281,10 +286,10 @@ static DnsRecord fromPb(com.google.api.services.dns.model.ResourceRecordSet pb) @Override public String toString() { return MoreObjects.toStringHelper(this) - .add("name", name()) - .add("rrdatas", records()) - .add("ttl", ttl()) - .add("type", type()) - .toString(); + .add("name", name()) + .add("rrdatas", records()) + .add("ttl", ttl()) + .add("type", type()) + .toString(); } } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java index e5b283a20acc..43ced20cf207 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -26,29 +26,32 @@ public class DnsRecordTest { private static final String NAME = "example.com."; private static final Integer TTL = 3600; - private static final DnsRecord.DnsRecordType TYPE = DnsRecord.DnsRecordType.AAAA; + private static final DnsRecord.Type TYPE = DnsRecord.Type.AAAA; private static final DnsRecord record = DnsRecord.builder(NAME, TYPE) - .ttl(TTL) - .build(); + .ttl(TTL) + .build(); @Test public void testDefaultDnsRecord() { DnsRecord record = DnsRecord.builder(NAME, TYPE).build(); assertEquals(0, record.records().size()); + assertEquals(TYPE, record.type()); + assertEquals(NAME, record.name()); } @Test public void testBuilder() { assertEquals(NAME, record.name()); assertEquals(TTL, record.ttl()); + assertEquals(TYPE, record.type()); assertEquals(0, record.records().size()); // verify that one can add records to the record set String testingRecord = "Testing record"; String anotherTestingRecord = "Another record 123"; DnsRecord anotherRecord = record.toBuilder() - .addRecord(testingRecord) - .addRecord(anotherTestingRecord) - .build(); + .addRecord(testingRecord) + .addRecord(anotherTestingRecord) + .build(); assertEquals(2, anotherRecord.records().size()); assertTrue(anotherRecord.records().contains(testingRecord)); assertTrue(anotherRecord.records().contains(anotherTestingRecord)); @@ -72,12 +75,12 @@ public void testEqualsAndNotEquals() { assertEquals(clone, record); clone = record.toBuilder().addRecord("another record").build(); assertNotEquals(clone, record); - final String differentName = "totally different name"; + String differentName = "totally different name"; clone = record.toBuilder().name(differentName).build(); assertNotEquals(clone, record); clone = record.toBuilder().ttl(record.ttl() + 1).build(); assertNotEquals(clone, record); - clone = record.toBuilder().type(DnsRecord.DnsRecordType.TXT).build(); + clone = record.toBuilder().type(DnsRecord.Type.TXT).build(); assertNotEquals(clone, record); } @@ -109,4 +112,24 @@ public void testToBuilder() { partial = DnsRecord.builder(NAME, TYPE).ttl(15).build(); assertEquals(partial, partial.toBuilder().build()); } -} \ No newline at end of file + + @Test + public void clearRecordSet() { + // make sure that we are starting not empty + DnsRecord clone = record.toBuilder().addRecord("record").addRecord("another").build(); + assertNotEquals(0, clone.records().size()); + clone = clone.toBuilder().clearRecords().build(); + assertEquals(0, clone.records().size()); + clone.toPb(); // verify that pb allows it + } + + @Test + public void removeFromRecordSet() { + String recordString = "record"; + // make sure that we are starting not empty + DnsRecord clone = record.toBuilder().addRecord(recordString).build(); + assertNotEquals(0, clone.records().size()); + clone = clone.toBuilder().removeRecord(recordString).build(); + assertEquals(0, clone.records().size()); + } +} From e8dd142fb0a6db4322fb83b79e999d97bd88e94e Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Tue, 19 Jan 2016 16:34:50 -0800 Subject: [PATCH 09/50] Created a ManagedZoneInfo class as part of the model. --- .../google/gcloud/dns/ManagedZoneInfo.java | 334 ++++++++++++++++++ .../gcloud/dns/ManagedZoneInfoTest.java | 198 +++++++++++ 2 files changed, 532 insertions(+) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java create mode 100644 gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java new file mode 100644 index 000000000000..e5b50b3e6669 --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java @@ -0,0 +1,334 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.MoreObjects; +import com.google.common.collect.ImmutableList; + +import org.joda.time.DateTime; +import org.joda.time.format.ISODateTimeFormat; + +import java.io.Serializable; +import java.math.BigInteger; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; + +/** + * This class is a container for the managed zone metainformation. Managed zone is a resource that + * represents a DNS zone hosted by the Cloud DNS service. See Google + * Cloud DNS documentation for more information. + */ +public class ManagedZoneInfo implements Serializable { + + private static final long serialVersionUID = 201601191647L; + private final String name; + private final Long id; + private final Long creationTimeMillis; + private final String dnsName; + private final String description; + private final String nameServerSet; + private final List nameServers; + + /** + * A builder for {@code ManagedZoneInfo}. + */ + public static class Builder { + private String name; + private Long id; + private Long creationTimeMillis; + private String dnsName; + private String description; + private String nameServerSet; + private List nameServers = new LinkedList<>(); + + private Builder() { + } + + private Builder(Long id) { + this.id = checkNotNull(id); + } + + private Builder(String name) { + this.name = checkNotNull(name); + } + + private Builder(String name, Long id) { + this.name = checkNotNull(name); + this.id = checkNotNull(id); + } + + /** + * Creates a builder from an existing ManagedZoneInfo object. + */ + Builder(ManagedZoneInfo info) { + this.name = info.name; + this.id = info.id; + this.creationTimeMillis = info.creationTimeMillis; + this.dnsName = info.dnsName; + this.description = info.description; + this.nameServerSet = info.nameServerSet; + this.nameServers.addAll(info.nameServers); + } + + /** + * Sets a mandatory user-provided name for the zone. It must be unique within the project. + */ + public Builder name(String name) { + this.name = checkNotNull(name); + return this; + } + + /** + * Sets an id for the managed zone which is assigned to the managed zone by the server. + */ + public Builder id(long id) { + this.id = id; + return this; + } + + /** + * Sets the time when this managed zone was created. + */ + Builder creationTimeMillis(long creationTimeMillis) { + checkArgument(creationTimeMillis >= 0, "The timestamp cannot be negative."); + this.creationTimeMillis = creationTimeMillis; + return this; + } + + /** + * Sets a mandatory DNS name of this managed zone, for instance "example.com.". + */ + public Builder dnsName(String dnsName) { + this.dnsName = checkNotNull(dnsName); + return this; + } + + /** + * Sets a mandatory description for this managed zone. The value is a string of at most 1024 + * characters (this limit is posed by Google Cloud DNS; gcloud-java does not enforce the limit) + * which has no effect on the managed zone's function. + */ + public Builder description(String description) { + this.description = checkNotNull(description); + return this; + } + + /** + * Optionally specifies the NameServerSet for this managed zone. A NameServerSet is a set of DNS + * name servers that all host the same ManagedZones. + */ + public Builder nameServerSet(String nameServerSet) { + // todo(mderka) add more to the doc when questions are answered by the service owner + this.nameServerSet = checkNotNull(nameServerSet); + return this; + } + + /** + * Sets a list of servers that hold the information about the managed zone. This information is + * provided by Google Cloud DNS and is read only. + */ + Builder nameServers(List nameServers) { + this.nameServers.addAll(checkNotNull(nameServers)); + return this; + } + + /** + * Removes all the nameservers from the list. + */ + Builder clearNameServers() { + this.nameServers.clear(); + return this; + } + + /** + * Builds the instance of ManagedZoneInfo based on the information set here. + */ + public ManagedZoneInfo build() { + return new ManagedZoneInfo(this); + } + } + + private ManagedZoneInfo(Builder builder) { + this.name = builder.name; + this.id = builder.id; + this.creationTimeMillis = builder.creationTimeMillis; + this.dnsName = builder.dnsName; + this.description = builder.description; + this.nameServerSet = builder.nameServerSet; + this.nameServers = ImmutableList.copyOf(builder.nameServers); + } + + /** + * Returns a builder for {@code ManagedZoneInfo} with an assigned {@code name}. + */ + public static Builder builder(String name) { + return new Builder(name); + } + + /** + * Returns a builder for {@code ManagedZoneInfo} with an assigned {@code id}. + */ + public static Builder builder(Long id) { + return new Builder(id); + } + + /** + * Returns a builder for {@code ManagedZoneInfo} with an assigned {@code name} and {@code id}. + */ + public static Builder builder(String name, Long id) { + return new Builder(name, id); + } + + /** + * Returns an empty builder for {@code ManagedZoneInfo}. We use it internally in {@code toPb()}. + */ + private static Builder builder() { + return new Builder(); + } + + /** + * Returns the user-defined name of the managed zone. + */ + public String name() { + return name; + } + + /** + * Returns the read-only managed zone id assigned by the server. + */ + public Long id() { + return id; + } + + /** + * Returns the time when this time that this managed zone was created on the server. + */ + public Long creationTimeMillis() { + return creationTimeMillis; + } + + /** + * Returns the DNS name of this managed zone, for instance "example.com.". + */ + public String dnsName() { + return dnsName; + } + + /** + * Returns the description of this managed zone. This is at most 1024 long mandatory string + * provided by the user. + */ + public String description() { + return description; + } + + /** + * Returns the optionally specified set of DNS name servers that all host this managed zone. + */ + public String nameServerSet() { + // todo(mderka) update this doc after finding out more about this from the service owners + return nameServerSet; + } + + /** + * The nameservers that the managed zone should be delegated to. This is defined by the Google DNS + * cloud. + */ + public List nameServers() { + return nameServers; + } + + /** + * Returns a builder for {@code ManagedZoneInfo} prepopulated with the metadata of this managed + * zone. + */ + public Builder toBuilder() { + return new Builder(this); + } + + com.google.api.services.dns.model.ManagedZone toPb() { + com.google.api.services.dns.model.ManagedZone pb = + new com.google.api.services.dns.model.ManagedZone(); + pb.setDescription(this.description()); + pb.setDnsName(this.dnsName()); + if (this.id() != null) { + pb.setId(BigInteger.valueOf(this.id())); + } + pb.setName(this.name()); + pb.setNameServers(this.nameServers()); + pb.setNameServerSet(this.nameServerSet()); + if (this.creationTimeMillis() != null) { + pb.setCreationTime(ISODateTimeFormat.dateTime() + .withZoneUTC() + .print(this.creationTimeMillis())); + } + return pb; + } + + static ManagedZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) { + Builder b = builder(); + if (pb.getDescription() != null) { + b.description(pb.getDescription()); + } + if (pb.getDnsName() != null) { + b.dnsName(pb.getDnsName()); + } + if (pb.getId() != null) { + b.id(pb.getId().longValue()); + } + if (pb.getName() != null) { + b.name(pb.getName()); + } + if (pb.getNameServers() != null) { + b.nameServers(pb.getNameServers()); + } + if (pb.getNameServerSet() != null) { + b.nameServerSet(pb.getNameServerSet()); + } + if (pb.getCreationTime() != null) { + b.creationTimeMillis(DateTime.parse(pb.getCreationTime()).getMillis()); + } + return b.build(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ManagedZoneInfo && Objects.equals(toPb(), ((ManagedZoneInfo) obj).toPb()); + } + + @Override + public int hashCode() { + return Objects.hash(name, id, creationTimeMillis, dnsName, + description, nameServerSet, nameServers); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("name", name()) + .add("id", id()) + .add("description", description()) + .add("dnsName", dnsName()) + .add("nameServerSet", nameServerSet()) + .add("nameServers", nameServers()) + .toString(); + } +} diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java new file mode 100644 index 000000000000..6516c7577d2f --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java @@ -0,0 +1,198 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import com.google.common.collect.Lists; + +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.LinkedList; +import java.util.List; + +public class ManagedZoneInfoTest { + + private static final String NAME = "mz-example.com"; + private static final Long ID = 123L; + private static final Long CREATION_TIME_MILLIS = 1123468321321L; + private static final String DNS_NAME = "example.com."; + private static final String DESCRIPTION = "description for the zone"; + private static final String NAME_SERVER_SET = "some set"; + private static final String NS1 = "name server 1"; + private static final String NS2 = "name server 2"; + private static final String NS3 = "name server 3"; + private static List nameServers = new LinkedList<>(); + private static ManagedZoneInfo info; + + @BeforeClass + public static void setUp() { + nameServers.add(NS1); + nameServers.add(NS2); + nameServers.add(NS3); + assertEquals(3, nameServers.size()); + info = ManagedZoneInfo.builder(NAME, ID) + .creationTimeMillis(CREATION_TIME_MILLIS) + .dnsName(DNS_NAME) + .description(DESCRIPTION) + .nameServerSet(NAME_SERVER_SET) + .nameServers(nameServers) + .build(); + System.out.println(info); + } + + @Test + public void testDefaultBuilders() { + ManagedZoneInfo withName = ManagedZoneInfo.builder(NAME).build(); + assertTrue(withName.nameServers().isEmpty()); + assertEquals(NAME, withName.name()); + assertNull(withName.id()); + assertNull(withName.creationTimeMillis()); + assertNull(withName.nameServerSet()); + assertNull(withName.description()); + assertNull(withName.dnsName()); + ManagedZoneInfo withId = ManagedZoneInfo.builder(ID).build(); + assertTrue(withId.nameServers().isEmpty()); + assertEquals(ID, withId.id()); + assertNull(withId.name()); + assertNull(withId.creationTimeMillis()); + assertNull(withId.nameServerSet()); + assertNull(withId.description()); + assertNull(withId.dnsName()); + ManagedZoneInfo withBoth = ManagedZoneInfo.builder(NAME, ID).build(); + assertTrue(withBoth.nameServers().isEmpty()); + assertEquals(ID, withBoth.id()); + assertEquals(NAME, withBoth.name()); + assertNull(withBoth.creationTimeMillis()); + assertNull(withBoth.nameServerSet()); + assertNull(withBoth.description()); + assertNull(withBoth.dnsName()); + } + + @Test + public void testBuilder() { + assertEquals(3, info.nameServers().size()); + assertEquals(NS1, info.nameServers().get(0)); + assertEquals(NS2, info.nameServers().get(1)); + assertEquals(NS3, info.nameServers().get(2)); + assertEquals(NAME, info.name()); + assertEquals(ID, info.id()); + assertEquals(CREATION_TIME_MILLIS, info.creationTimeMillis()); + assertEquals(NAME_SERVER_SET, info.nameServerSet()); + assertEquals(DESCRIPTION, info.description()); + assertEquals(DNS_NAME, info.dnsName()); + } + + @Test + public void testValidCreationTime() { + try { + ManagedZoneInfo.builder(NAME).creationTimeMillis(-1); + fail("A negative value is not acceptable for creation time."); + } catch (IllegalArgumentException e) { + // expected + } + ManagedZoneInfo.builder(NAME).creationTimeMillis(0); + ManagedZoneInfo.builder(NAME).creationTimeMillis(Long.MAX_VALUE); + } + + @Test + public void testEqualsAndNotEquals() { + ManagedZoneInfo clone = info.toBuilder().build(); + assertEquals(clone, info); + List moreServers = Lists.newLinkedList(nameServers); + moreServers.add(NS1); + clone = info.toBuilder().nameServers(moreServers).build(); + assertNotEquals(clone, info); + String differentName = "totally different name"; + clone = info.toBuilder().name(differentName).build(); + assertNotEquals(clone, info); + clone = info.toBuilder().creationTimeMillis(info.creationTimeMillis() + 1).build(); + assertNotEquals(clone, info); + clone = info.toBuilder().description(info.description() + "aaaa").build(); + assertNotEquals(clone, info); + clone = info.toBuilder().dnsName(differentName).build(); + assertNotEquals(clone, info); + clone = info.toBuilder().id(info.id() + 1).build(); + assertNotEquals(clone, info); + clone = info.toBuilder().nameServerSet(info.nameServerSet() + "salt").build(); + assertNotEquals(clone, info); + } + + @Test + public void testSameHashCodeOnEquals() { + int hash = info.hashCode(); + ManagedZoneInfo clone = info.toBuilder().build(); + assertEquals(clone.hashCode(), hash); + } + + @Test + public void testToBuilder() { + assertEquals(info, info.toBuilder().build()); + ManagedZoneInfo partial = ManagedZoneInfo.builder(NAME).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ManagedZoneInfo.builder(ID).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ManagedZoneInfo.builder(NAME).description(DESCRIPTION).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ManagedZoneInfo.builder(NAME).dnsName(DNS_NAME).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ManagedZoneInfo.builder(NAME).creationTimeMillis(CREATION_TIME_MILLIS).build(); + assertEquals(partial, partial.toBuilder().build()); + List nameServers = new LinkedList<>(); + nameServers.add(NS1); + partial = ManagedZoneInfo.builder(NAME).nameServers(nameServers).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ManagedZoneInfo.builder(NAME).nameServerSet(NAME_SERVER_SET).build(); + assertEquals(partial, partial.toBuilder().build()); + } + + @Test + public void testToAndFromPb() { + assertEquals(info, ManagedZoneInfo.fromPb(info.toPb())); + ManagedZoneInfo partial = ManagedZoneInfo.builder(NAME).build(); + assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); + partial = ManagedZoneInfo.builder(ID).build(); + assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); + partial = ManagedZoneInfo.builder(NAME).description(DESCRIPTION).build(); + assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); + partial = ManagedZoneInfo.builder(NAME).dnsName(DNS_NAME).build(); + assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); + partial = ManagedZoneInfo.builder(NAME).creationTimeMillis(CREATION_TIME_MILLIS).build(); + assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); + List nameServers = new LinkedList<>(); + nameServers.add(NS1); + partial = ManagedZoneInfo.builder(NAME).nameServers(nameServers).build(); + assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); + partial = ManagedZoneInfo.builder(NAME).nameServerSet(NAME_SERVER_SET).build(); + assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); + } + + @Test + public void testClearNameServers() { + ManagedZoneInfo clone = info.toBuilder().build(); + assertFalse(clone.nameServers().isEmpty()); + clone = clone.toBuilder().clearNameServers().build(); + assertTrue(clone.nameServers().isEmpty()); + clone.toPb(); // test that this is allowed + } +} From c95c3aaa0c514ba573f29ee8d19a7619a0bf0e1c Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Fri, 22 Jan 2016 18:38:10 -0800 Subject: [PATCH 10/50] Implemented comments by @aozarov. --- .../google/gcloud/dns/ManagedZoneInfo.java | 65 ++++++++----------- .../gcloud/dns/ManagedZoneInfoTest.java | 43 ++++++------ 2 files changed, 49 insertions(+), 59 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java index e5b50b3e6669..191d41967124 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java @@ -16,11 +16,11 @@ package com.google.gcloud.dns; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import org.joda.time.DateTime; import org.joda.time.format.ISODateTimeFormat; @@ -32,15 +32,16 @@ import java.util.Objects; /** - * This class is a container for the managed zone metainformation. Managed zone is a resource that - * represents a DNS zone hosted by the Cloud DNS service. See Google - * Cloud DNS documentation for more information. + * A {@code ManagedZone} represents a DNS zone hosted by the Google Cloud DNS service. A zone is a + * subtree of the DNS namespace under one administrative responsibility. See Google Cloud DNS documentation for + * more information. */ public class ManagedZoneInfo implements Serializable { private static final long serialVersionUID = 201601191647L; private final String name; - private final Long id; + private final BigInteger id; private final Long creationTimeMillis; private final String dnsName; private final String description; @@ -52,17 +53,21 @@ public class ManagedZoneInfo implements Serializable { */ public static class Builder { private String name; - private Long id; + private BigInteger id; private Long creationTimeMillis; private String dnsName; private String description; private String nameServerSet; private List nameServers = new LinkedList<>(); + /** + * Returns an empty builder for {@code ManagedZoneInfo}. We use it internally in {@code + * toPb()}. + */ private Builder() { } - private Builder(Long id) { + private Builder(BigInteger id) { this.id = checkNotNull(id); } @@ -70,7 +75,7 @@ private Builder(String name) { this.name = checkNotNull(name); } - private Builder(String name, Long id) { + private Builder(String name, BigInteger id) { this.name = checkNotNull(name); this.id = checkNotNull(id); } @@ -99,7 +104,7 @@ public Builder name(String name) { /** * Sets an id for the managed zone which is assigned to the managed zone by the server. */ - public Builder id(long id) { + Builder id(BigInteger id) { this.id = id; return this; } @@ -108,7 +113,6 @@ public Builder id(long id) { * Sets the time when this managed zone was created. */ Builder creationTimeMillis(long creationTimeMillis) { - checkArgument(creationTimeMillis >= 0, "The timestamp cannot be negative."); this.creationTimeMillis = creationTimeMillis; return this; } @@ -123,8 +127,7 @@ public Builder dnsName(String dnsName) { /** * Sets a mandatory description for this managed zone. The value is a string of at most 1024 - * characters (this limit is posed by Google Cloud DNS; gcloud-java does not enforce the limit) - * which has no effect on the managed zone's function. + * characters which has no effect on the managed zone's function. */ public Builder description(String description) { this.description = checkNotNull(description); @@ -133,7 +136,8 @@ public Builder description(String description) { /** * Optionally specifies the NameServerSet for this managed zone. A NameServerSet is a set of DNS - * name servers that all host the same ManagedZones. + * name servers that all host the same ManagedZones. Most users will not need to specify this + * value. */ public Builder nameServerSet(String nameServerSet) { // todo(mderka) add more to the doc when questions are answered by the service owner @@ -146,20 +150,13 @@ public Builder nameServerSet(String nameServerSet) { * provided by Google Cloud DNS and is read only. */ Builder nameServers(List nameServers) { - this.nameServers.addAll(checkNotNull(nameServers)); + checkNotNull(nameServers); + this.nameServers = Lists.newLinkedList(nameServers); return this; } /** - * Removes all the nameservers from the list. - */ - Builder clearNameServers() { - this.nameServers.clear(); - return this; - } - - /** - * Builds the instance of ManagedZoneInfo based on the information set here. + * Builds the instance of {@code ManagedZoneInfo} based on the information set by this builder. */ public ManagedZoneInfo build() { return new ManagedZoneInfo(this); @@ -186,24 +183,17 @@ public static Builder builder(String name) { /** * Returns a builder for {@code ManagedZoneInfo} with an assigned {@code id}. */ - public static Builder builder(Long id) { + public static Builder builder(BigInteger id) { return new Builder(id); } /** * Returns a builder for {@code ManagedZoneInfo} with an assigned {@code name} and {@code id}. */ - public static Builder builder(String name, Long id) { + public static Builder builder(String name, BigInteger id) { return new Builder(name, id); } - /** - * Returns an empty builder for {@code ManagedZoneInfo}. We use it internally in {@code toPb()}. - */ - private static Builder builder() { - return new Builder(); - } - /** * Returns the user-defined name of the managed zone. */ @@ -214,7 +204,7 @@ public String name() { /** * Returns the read-only managed zone id assigned by the server. */ - public Long id() { + public BigInteger id() { return id; } @@ -233,8 +223,7 @@ public String dnsName() { } /** - * Returns the description of this managed zone. This is at most 1024 long mandatory string - * provided by the user. + * Returns the description of this managed zone. */ public String description() { return description; @@ -270,7 +259,7 @@ com.google.api.services.dns.model.ManagedZone toPb() { pb.setDescription(this.description()); pb.setDnsName(this.dnsName()); if (this.id() != null) { - pb.setId(BigInteger.valueOf(this.id())); + pb.setId(this.id()); } pb.setName(this.name()); pb.setNameServers(this.nameServers()); @@ -284,7 +273,7 @@ com.google.api.services.dns.model.ManagedZone toPb() { } static ManagedZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) { - Builder b = builder(); + Builder b = new Builder(); if (pb.getDescription() != null) { b.description(pb.getDescription()); } @@ -292,7 +281,7 @@ static ManagedZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) b.dnsName(pb.getDnsName()); } if (pb.getId() != null) { - b.id(pb.getId().longValue()); + b.id(pb.getId()); } if (pb.getName() != null) { b.name(pb.getName()); diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java index 6516c7577d2f..89c9426f5b81 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java @@ -17,24 +17,23 @@ package com.google.gcloud.dns; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; import com.google.common.collect.Lists; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; +import java.math.BigInteger; import java.util.LinkedList; import java.util.List; public class ManagedZoneInfoTest { private static final String NAME = "mz-example.com"; - private static final Long ID = 123L; + private static final BigInteger ID = BigInteger.valueOf(123L); private static final Long CREATION_TIME_MILLIS = 1123468321321L; private static final String DNS_NAME = "example.com."; private static final String DESCRIPTION = "description for the zone"; @@ -42,15 +41,14 @@ public class ManagedZoneInfoTest { private static final String NS1 = "name server 1"; private static final String NS2 = "name server 2"; private static final String NS3 = "name server 3"; - private static List nameServers = new LinkedList<>(); - private static ManagedZoneInfo info; + private List nameServers = new LinkedList<>(); + private ManagedZoneInfo info; - @BeforeClass - public static void setUp() { + @Before + public void setUp() { nameServers.add(NS1); nameServers.add(NS2); nameServers.add(NS3); - assertEquals(3, nameServers.size()); info = ManagedZoneInfo.builder(NAME, ID) .creationTimeMillis(CREATION_TIME_MILLIS) .dnsName(DNS_NAME) @@ -58,7 +56,6 @@ public static void setUp() { .nameServerSet(NAME_SERVER_SET) .nameServers(nameServers) .build(); - System.out.println(info); } @Test @@ -105,12 +102,7 @@ public void testBuilder() { @Test public void testValidCreationTime() { - try { - ManagedZoneInfo.builder(NAME).creationTimeMillis(-1); - fail("A negative value is not acceptable for creation time."); - } catch (IllegalArgumentException e) { - // expected - } + ManagedZoneInfo.builder(NAME).creationTimeMillis(-1); ManagedZoneInfo.builder(NAME).creationTimeMillis(0); ManagedZoneInfo.builder(NAME).creationTimeMillis(Long.MAX_VALUE); } @@ -132,7 +124,7 @@ public void testEqualsAndNotEquals() { assertNotEquals(clone, info); clone = info.toBuilder().dnsName(differentName).build(); assertNotEquals(clone, info); - clone = info.toBuilder().id(info.id() + 1).build(); + clone = info.toBuilder().id(info.id().add(BigInteger.ONE)).build(); assertNotEquals(clone, info); clone = info.toBuilder().nameServerSet(info.nameServerSet() + "salt").build(); assertNotEquals(clone, info); @@ -188,11 +180,20 @@ public void testToAndFromPb() { } @Test - public void testClearNameServers() { - ManagedZoneInfo clone = info.toBuilder().build(); - assertFalse(clone.nameServers().isEmpty()); - clone = clone.toBuilder().clearNameServers().build(); + public void testEmptyNameServers() { + ManagedZoneInfo clone = info.toBuilder().nameServers(new LinkedList()).build(); assertTrue(clone.nameServers().isEmpty()); clone.toPb(); // test that this is allowed } + + @Test + public void testDateParsing() { + com.google.api.services.dns.model.ManagedZone pb = + info.toPb(); + pb.setCreationTime("2016-01-19T18:00:12.854Z"); // a real value obtained from Google Cloud DNS + ManagedZoneInfo mz = ManagedZoneInfo.fromPb(pb); // parses the string timestamp to millis + com.google.api.services.dns.model.ManagedZone pbClone = mz.toPb(); // converts it back to string + assertEquals(pb, pbClone); + assertEquals(pb.getCreationTime(), pbClone.getCreationTime()); + } } From dacea19f586e0ae5f344da65f4ebc5c248818288 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Mon, 25 Jan 2016 09:06:33 -0800 Subject: [PATCH 11/50] Another round of comments from @aozarov. --- .../google/gcloud/dns/ManagedZoneInfo.java | 1 + .../com/google/gcloud/dns/DnsRecordTest.java | 10 +- .../gcloud/dns/ManagedZoneInfoTest.java | 100 ++++++++---------- 3 files changed, 48 insertions(+), 63 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java index 191d41967124..d27e134ad908 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java @@ -318,6 +318,7 @@ public String toString() { .add("dnsName", dnsName()) .add("nameServerSet", nameServerSet()) .add("nameServers", nameServers()) + .add("creationTimeMillis", creationTimeMillis()) .toString(); } } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java index 43ced20cf207..412aa2ce08ad 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -72,16 +72,16 @@ public void testValidTtl() { @Test public void testEqualsAndNotEquals() { DnsRecord clone = record.toBuilder().build(); - assertEquals(clone, record); + assertEquals(record, clone); clone = record.toBuilder().addRecord("another record").build(); - assertNotEquals(clone, record); + assertNotEquals(record, clone); String differentName = "totally different name"; clone = record.toBuilder().name(differentName).build(); - assertNotEquals(clone, record); + assertNotEquals(record, clone); clone = record.toBuilder().ttl(record.ttl() + 1).build(); - assertNotEquals(clone, record); + assertNotEquals(record, clone); clone = record.toBuilder().type(DnsRecord.Type.TXT).build(); - assertNotEquals(clone, record); + assertNotEquals(record, clone); } @Test diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java index 89c9426f5b81..936164c81723 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java @@ -21,9 +21,9 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.junit.Before; import org.junit.Test; import java.math.BigInteger; @@ -41,22 +41,14 @@ public class ManagedZoneInfoTest { private static final String NS1 = "name server 1"; private static final String NS2 = "name server 2"; private static final String NS3 = "name server 3"; - private List nameServers = new LinkedList<>(); - private ManagedZoneInfo info; - - @Before - public void setUp() { - nameServers.add(NS1); - nameServers.add(NS2); - nameServers.add(NS3); - info = ManagedZoneInfo.builder(NAME, ID) - .creationTimeMillis(CREATION_TIME_MILLIS) - .dnsName(DNS_NAME) - .description(DESCRIPTION) - .nameServerSet(NAME_SERVER_SET) - .nameServers(nameServers) - .build(); - } + private static final List NAME_SERVERS = ImmutableList.of(NS1, NS2, NS3); + private static final ManagedZoneInfo INFO = ManagedZoneInfo.builder(NAME, ID) + .creationTimeMillis(CREATION_TIME_MILLIS) + .dnsName(DNS_NAME) + .description(DESCRIPTION) + .nameServerSet(NAME_SERVER_SET) + .nameServers(NAME_SERVERS) + .build(); @Test public void testDefaultBuilders() { @@ -88,58 +80,51 @@ public void testDefaultBuilders() { @Test public void testBuilder() { - assertEquals(3, info.nameServers().size()); - assertEquals(NS1, info.nameServers().get(0)); - assertEquals(NS2, info.nameServers().get(1)); - assertEquals(NS3, info.nameServers().get(2)); - assertEquals(NAME, info.name()); - assertEquals(ID, info.id()); - assertEquals(CREATION_TIME_MILLIS, info.creationTimeMillis()); - assertEquals(NAME_SERVER_SET, info.nameServerSet()); - assertEquals(DESCRIPTION, info.description()); - assertEquals(DNS_NAME, info.dnsName()); - } - - @Test - public void testValidCreationTime() { - ManagedZoneInfo.builder(NAME).creationTimeMillis(-1); - ManagedZoneInfo.builder(NAME).creationTimeMillis(0); - ManagedZoneInfo.builder(NAME).creationTimeMillis(Long.MAX_VALUE); + assertEquals(3, INFO.nameServers().size()); + assertEquals(NS1, INFO.nameServers().get(0)); + assertEquals(NS2, INFO.nameServers().get(1)); + assertEquals(NS3, INFO.nameServers().get(2)); + assertEquals(NAME, INFO.name()); + assertEquals(ID, INFO.id()); + assertEquals(CREATION_TIME_MILLIS, INFO.creationTimeMillis()); + assertEquals(NAME_SERVER_SET, INFO.nameServerSet()); + assertEquals(DESCRIPTION, INFO.description()); + assertEquals(DNS_NAME, INFO.dnsName()); } @Test public void testEqualsAndNotEquals() { - ManagedZoneInfo clone = info.toBuilder().build(); - assertEquals(clone, info); - List moreServers = Lists.newLinkedList(nameServers); + ManagedZoneInfo clone = INFO.toBuilder().build(); + assertEquals(INFO, clone); + List moreServers = Lists.newLinkedList(NAME_SERVERS); moreServers.add(NS1); - clone = info.toBuilder().nameServers(moreServers).build(); - assertNotEquals(clone, info); + clone = INFO.toBuilder().nameServers(moreServers).build(); + assertNotEquals(INFO, clone); String differentName = "totally different name"; - clone = info.toBuilder().name(differentName).build(); - assertNotEquals(clone, info); - clone = info.toBuilder().creationTimeMillis(info.creationTimeMillis() + 1).build(); - assertNotEquals(clone, info); - clone = info.toBuilder().description(info.description() + "aaaa").build(); - assertNotEquals(clone, info); - clone = info.toBuilder().dnsName(differentName).build(); - assertNotEquals(clone, info); - clone = info.toBuilder().id(info.id().add(BigInteger.ONE)).build(); - assertNotEquals(clone, info); - clone = info.toBuilder().nameServerSet(info.nameServerSet() + "salt").build(); - assertNotEquals(clone, info); + clone = INFO.toBuilder().name(differentName).build(); + assertNotEquals(INFO, clone); + clone = INFO.toBuilder().creationTimeMillis(INFO.creationTimeMillis() + 1).build(); + assertNotEquals(INFO, clone); + clone = INFO.toBuilder().description(INFO.description() + "aaaa").build(); + assertNotEquals(INFO, clone); + clone = INFO.toBuilder().dnsName(differentName).build(); + assertNotEquals(INFO, clone); + clone = INFO.toBuilder().id(INFO.id().add(BigInteger.ONE)).build(); + assertNotEquals(INFO, clone); + clone = INFO.toBuilder().nameServerSet(INFO.nameServerSet() + "salt").build(); + assertNotEquals(INFO, clone); } @Test public void testSameHashCodeOnEquals() { - int hash = info.hashCode(); - ManagedZoneInfo clone = info.toBuilder().build(); + int hash = INFO.hashCode(); + ManagedZoneInfo clone = INFO.toBuilder().build(); assertEquals(clone.hashCode(), hash); } @Test public void testToBuilder() { - assertEquals(info, info.toBuilder().build()); + assertEquals(INFO, INFO.toBuilder().build()); ManagedZoneInfo partial = ManagedZoneInfo.builder(NAME).build(); assertEquals(partial, partial.toBuilder().build()); partial = ManagedZoneInfo.builder(ID).build(); @@ -160,7 +145,7 @@ public void testToBuilder() { @Test public void testToAndFromPb() { - assertEquals(info, ManagedZoneInfo.fromPb(info.toPb())); + assertEquals(INFO, ManagedZoneInfo.fromPb(INFO.toPb())); ManagedZoneInfo partial = ManagedZoneInfo.builder(NAME).build(); assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); partial = ManagedZoneInfo.builder(ID).build(); @@ -181,15 +166,14 @@ public void testToAndFromPb() { @Test public void testEmptyNameServers() { - ManagedZoneInfo clone = info.toBuilder().nameServers(new LinkedList()).build(); + ManagedZoneInfo clone = INFO.toBuilder().nameServers(new LinkedList()).build(); assertTrue(clone.nameServers().isEmpty()); clone.toPb(); // test that this is allowed } @Test public void testDateParsing() { - com.google.api.services.dns.model.ManagedZone pb = - info.toPb(); + com.google.api.services.dns.model.ManagedZone pb = INFO.toPb(); pb.setCreationTime("2016-01-19T18:00:12.854Z"); // a real value obtained from Google Cloud DNS ManagedZoneInfo mz = ManagedZoneInfo.fromPb(pb); // parses the string timestamp to millis com.google.api.services.dns.model.ManagedZone pbClone = mz.toPb(); // converts it back to string From 273b4418df7ed3d1dae00f6f66228c1dcee3b1ac Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Mon, 25 Jan 2016 17:11:34 -0800 Subject: [PATCH 12/50] Implemented ChangeRequest. --- .../com/google/gcloud/dns/ChangeRequest.java | 340 ++++++++++++++++++ .../com/google/gcloud/dns/DnsRecordTest.java | 1 + 2 files changed, 341 insertions(+) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java new file mode 100644 index 000000000000..40c6ff0ad151 --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java @@ -0,0 +1,340 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import com.google.common.base.MoreObjects; +import com.google.common.collect.Lists; + +import org.joda.time.DateTime; +import org.joda.time.format.ISODateTimeFormat; + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * A class representing a change. A change is an atomic update to a collection of {@link DnsRecord}s + * within a {@code ManagedZone}. + * + * @see Google Cloud DNS documentation + */ +public class ChangeRequest implements Serializable { + + private static final long serialVersionUID = 201601251649L; + private final List additions; + private final List deletions; + private final String id; + private final Long startTimeMillis; + private final Status status; + + /** + * This enumerates the possible states of a {@code ChangeRequest}. + * + * @see Google Cloud DNS + * documentation + */ + public enum Status { + PENDING("pending"), + DONE("done"); + + private final String status; + + Status(String status) { + this.status = status; + } + + static Status translate(String status) { + if ("pending".equals(status)) { + return PENDING; + } else if ("done".equals(status)) { + return DONE; + } else { + throw new IllegalArgumentException("Such a status is unknown."); + } + } + } + + /** + * A builder for {@code ChangeRequest}s. + */ + public static class Builder { + + private List additions = new LinkedList<>(); + private List deletions = new LinkedList<>(); + private String id; + private Long startTimeMillis; + private Status status; + + private Builder(ChangeRequest cr) { + this.additions = Lists.newLinkedList(cr.additions()); + this.deletions = Lists.newLinkedList(cr.deletions()); + this.id = cr.id(); + this.startTimeMillis = cr.startTimeMillis(); + this.status = cr.status(); + } + + private Builder() { + } + + /** + * Sets a collection of {@link DnsRecord}s which are to be added to the zone upon executing this + * {@code ChangeRequest}. + */ + public Builder additions(List additions) { + this.additions = Lists.newLinkedList(checkNotNull(additions)); + return this; + } + + /** + * Adds a {@link DnsRecord} which to be added to the zone upon executing this + * {@code ChangeRequest}. + */ + public Builder add(DnsRecord record) { + this.additions.add(checkNotNull(record)); + return this; + } + + /** + * Adds a {@link DnsRecord} which to be deleted to the zone upon executing this + * {@code ChangeRequest}. + */ + public Builder delete(DnsRecord record) { + this.deletions.add(checkNotNull(record)); + return this; + } + + /** + * Clears the collection of {@link DnsRecord}s which are to be added to the zone upon executing + * this {@code ChangeRequest}. + */ + public Builder clearAdditions() { + this.additions.clear(); + return this; + } + + /** + * Clears the collection of {@link DnsRecord}s which are to be deleted from the zone upon + * executing this {@code ChangeRequest}. + */ + public Builder clearDeletions() { + this.deletions.clear(); + return this; + } + + /** + * Removes a single {@link DnsRecord} from the collection of of records to be + * added to the zone upon executing this {@code ChangeRequest}. + */ + public Builder removeAddition(DnsRecord record) { + this.additions.remove(record); + return this; + } + + /** + * Removes a single {@link DnsRecord} from the collection of of records to be + * deleted from the zone upon executing this {@code ChangeRequest}. + */ + public Builder removeDeletion(DnsRecord record) { + this.deletions.remove(record); + return this; + } + + /** + * Sets a collection of {@link DnsRecord}s which are to be deleted from the zone upon executing + * this {@code ChangeRequest}. + */ + public Builder deletions(List deletions) { + this.deletions = Lists.newLinkedList(checkNotNull(deletions)); + return this; + } + + /** + * Associates a server-assigned id to this {@code ChangeRequest}. + */ + Builder id(String id) { + this.id = checkNotNull(id); + return this; + } + + /** + * Sets the time when this {@code ChangeRequest} was started by a server. + */ + Builder startTimeMillis(long startTimeMillis) { + this.startTimeMillis = startTimeMillis; + return this; + } + + /** + * Sets the current status of this {@code ChangeRequest}. + */ + Builder status(Status status) { + this.status = checkNotNull(status); + return this; + } + + /** + * Creates a {@code ChangeRequest} instance populated by the values associated with this + * builder. + */ + public ChangeRequest build() { + return new ChangeRequest(this); + } + } + + private ChangeRequest(Builder builder) { + this.additions = builder.additions; + this.deletions = builder.deletions; + this.id = builder.id; + this.startTimeMillis = builder.startTimeMillis; + this.status = builder.status; + } + + /** + * Returns an empty builder for the {@code ChangeRequest} class. + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Creates a builder populated with values of this {@code ChangeRequest}. + */ + public Builder toBuilder() { + return new Builder(this); + } + + /** + * Returns the list of {@link DnsRecord}s to be added to the zone upon executing this {@code + * ChangeRequest}. + */ + public List additions() { + return additions; + } + + /** + * Returns the list of {@link DnsRecord}s to be deleted from the zone upon executing this {@code + * ChangeRequest}. + */ + public List deletions() { + return deletions; + } + + /** + * Returns the id assigned to this {@code ChangeRequest} by the server. + */ + public String id() { + return id; + } + + /** + * Returns the time when this {@code ChangeRequest} was started by the server. + */ + public Long startTimeMillis() { + return startTimeMillis; + } + + /** + * Returns the status of this {@code ChangeRequest}. + */ + public Status status() { + return status; + } + + com.google.api.services.dns.model.Change toPb() { + com.google.api.services.dns.model.Change pb = + new com.google.api.services.dns.model.Change(); + // set id + if (id() != null) { + pb.setId(id()); + } + // set timestamp + if (startTimeMillis() != null) { + pb.setStartTime(ISODateTimeFormat.dateTime().withZoneUTC().print(startTimeMillis())); + } + // set status + if (status() != null) { + pb.setStatus(status().status); + } + // set a list of additions + if (additions() != null) { + LinkedList additionsPb = + new LinkedList<>(); + for (DnsRecord addition : additions()) { + additionsPb.add(addition.toPb()); + } + pb.setAdditions(additionsPb); + } + // set a list of deletions + if (deletions() != null) { + LinkedList deletionsPb = + new LinkedList<>(); + for (DnsRecord deletion : deletions()) { + deletionsPb.add(deletion.toPb()); + } + pb.setDeletions(deletionsPb); + } + return pb; + } + + static ChangeRequest fromPb(com.google.api.services.dns.model.Change pb) { + Builder b = builder(); + if (pb.getId() != null) { + b.id(pb.getId()); + } + if (pb.getStartTime() != null) { + b.startTimeMillis(DateTime.parse(pb.getStartTime()).getMillis()); + } + if (pb.getStatus() != null) { + b.status(ChangeRequest.Status.translate(pb.getStatus())); + } + if (pb.getDeletions() != null) { + for (com.google.api.services.dns.model.ResourceRecordSet deletion : pb.getDeletions()) { + b.delete(DnsRecord.fromPb(deletion)); + } + } + if (pb.getAdditions() != null) { + for (com.google.api.services.dns.model.ResourceRecordSet addition : pb.getAdditions()) { + b.add(DnsRecord.fromPb(addition)); + } + } + return b.build(); + } + + @Override + public boolean equals(Object o) { + return (o instanceof ChangeRequest) && this.toPb().equals(((ChangeRequest) o).toPb()); + } + + @Override + public int hashCode() { + return Objects.hash(additions, deletions, id, startTimeMillis, status); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("additions", additions) + .add("deletions", deletions) + .add("id", id) + .add("startTimeMillis", startTimeMillis) + .add("status", status) + .toString(); + } +} diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java index 43ced20cf207..312cf564cbf2 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.google.gcloud.dns; import static org.junit.Assert.assertEquals; From 35cfd616b7294419d16aed9232fe40bb94321884 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Tue, 26 Jan 2016 14:31:39 -0800 Subject: [PATCH 13/50] Added test for ChangeRequest. --- .../google/gcloud/dns/ChangeRequestTest.java | 231 ++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 gcloud-java-dns/src/test/java/com/google/gcloud/dns/ChangeRequestTest.java diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ChangeRequestTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ChangeRequestTest.java new file mode 100644 index 000000000000..da8006da8b51 --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ChangeRequestTest.java @@ -0,0 +1,231 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import com.google.common.collect.ImmutableList; + +import org.junit.Test; + +import java.util.List; + +public class ChangeRequestTest { + + private static final String ID = "cr-id-1"; + private static final Long START_TIME_MILLIS = 12334567890L; + private static final ChangeRequest.Status STATUS = ChangeRequest.Status.PENDING; + private static final String NAME1 = "dns1"; + private static final DnsRecord.Type TYPE1 = DnsRecord.Type.A; + private static final String NAME2 = "dns2"; + private static final DnsRecord.Type TYPE2 = DnsRecord.Type.AAAA; + private static final String NAME3 = "dns3"; + private static final DnsRecord.Type TYPE3 = DnsRecord.Type.MX; + private static final DnsRecord RECORD1 = DnsRecord.builder(NAME1, TYPE1).build(); + private static final DnsRecord RECORD2 = DnsRecord.builder(NAME2, TYPE2).build(); + private static final DnsRecord RECORD3 = DnsRecord.builder(NAME3, TYPE3).build(); + private static final List ADDITIONS = ImmutableList.of(RECORD1, RECORD2); + private static final List DELETIONS = ImmutableList.of(RECORD3); + private static final ChangeRequest CHANGE = ChangeRequest.builder() + .add(RECORD1) + .add(RECORD2) + .delete(RECORD3) + .startTimeMillis(START_TIME_MILLIS) + .status(STATUS) + .id(ID) + .build(); + + @Test + public void testEmptyBuilder() { + ChangeRequest cr = ChangeRequest.builder().build(); + assertNotNull(cr.deletions()); + assertTrue(cr.deletions().isEmpty()); + assertNotNull(cr.additions()); + assertTrue(cr.additions().isEmpty()); + } + + @Test + public void testBuilder() { + assertEquals(ID, CHANGE.id()); + assertEquals(STATUS, CHANGE.status()); + assertEquals(START_TIME_MILLIS, CHANGE.startTimeMillis()); + assertEquals(ADDITIONS, CHANGE.additions()); + assertEquals(DELETIONS, CHANGE.deletions()); + List recordList = ImmutableList.of(RECORD1); + ChangeRequest another = CHANGE.toBuilder().additions(recordList).build(); + assertEquals(recordList, another.additions()); + assertEquals(CHANGE.deletions(), another.deletions()); + another = CHANGE.toBuilder().deletions(recordList).build(); + assertEquals(recordList, another.deletions()); + assertEquals(CHANGE.additions(), another.additions()); + } + + @Test + public void testEqualsAndNotEquals() { + ChangeRequest clone = CHANGE.toBuilder().build(); + assertEquals(CHANGE, clone); + clone = ChangeRequest.fromPb(CHANGE.toPb()); + assertEquals(CHANGE, clone); + clone = CHANGE.toBuilder().id("some-other-id").build(); + assertNotEquals(CHANGE, clone); + clone = CHANGE.toBuilder().startTimeMillis(CHANGE.startTimeMillis() + 1).build(); + assertNotEquals(CHANGE, clone); + clone = CHANGE.toBuilder().add(RECORD3).build(); + assertNotEquals(CHANGE, clone); + clone = CHANGE.toBuilder().delete(RECORD1).build(); + assertNotEquals(CHANGE, clone); + ChangeRequest empty = ChangeRequest.builder().build(); + assertNotEquals(CHANGE, empty); + assertEquals(empty, ChangeRequest.builder().build()); + } + + @Test + public void testSameHashCodeOnEquals() { + ChangeRequest clone = CHANGE.toBuilder().build(); + assertEquals(CHANGE, clone); + assertEquals(CHANGE.hashCode(), clone.hashCode()); + ChangeRequest empty = ChangeRequest.builder().build(); + assertEquals(empty.hashCode(), ChangeRequest.builder().build().hashCode()); + } + + @Test + public void testToAndFromPb() { + assertEquals(CHANGE, ChangeRequest.fromPb(CHANGE.toPb())); + ChangeRequest partial = ChangeRequest.builder().build(); + assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); + partial = ChangeRequest.builder().id(ID).build(); + assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); + partial = ChangeRequest.builder().add(RECORD1).build(); + assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); + partial = ChangeRequest.builder().delete(RECORD1).build(); + assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); + partial = ChangeRequest.builder().additions(ADDITIONS).build(); + assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); + partial = ChangeRequest.builder().deletions(DELETIONS).build(); + assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); + partial = ChangeRequest.builder().startTimeMillis(START_TIME_MILLIS).build(); + assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); + partial = ChangeRequest.builder().status(STATUS).build(); + assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); + } + + @Test + public void testToBuilder() { + assertEquals(CHANGE, CHANGE.toBuilder().build()); + ChangeRequest partial = ChangeRequest.builder().build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ChangeRequest.builder().id(ID).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ChangeRequest.builder().add(RECORD1).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ChangeRequest.builder().delete(RECORD1).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ChangeRequest.builder().additions(ADDITIONS).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ChangeRequest.builder().deletions(DELETIONS).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ChangeRequest.builder().startTimeMillis(START_TIME_MILLIS).build(); + assertEquals(partial, partial.toBuilder().build()); + partial = ChangeRequest.builder().status(STATUS).build(); + assertEquals(partial, partial.toBuilder().build()); + } + + @Test + public void testClearAdditions() { + ChangeRequest clone = CHANGE.toBuilder().clearAdditions().build(); + assertTrue(clone.additions().isEmpty()); + assertFalse(clone.deletions().isEmpty()); + } + + @Test + public void testAddAddition() { + try { + CHANGE.toBuilder().add(null).build(); + fail("Should not be able to add null DnsRecord."); + } catch (NullPointerException e) { + // expected + } + ChangeRequest clone = CHANGE.toBuilder().add(RECORD1).build(); + assertEquals(CHANGE.additions().size() + 1, clone.additions().size()); + } + + @Test + public void testAddDeletion() { + try { + ChangeRequest clone = CHANGE.toBuilder().delete(null).build(); + fail("Should not be able to delete null DnsRecord."); + } catch (NullPointerException e) { + // expected + } + ChangeRequest clone = CHANGE.toBuilder().delete(RECORD1).build(); + assertEquals(CHANGE.deletions().size() + 1, clone.deletions().size()); + } + + @Test + public void testClearDeletions() { + ChangeRequest clone = CHANGE.toBuilder().clearDeletions().build(); + assertTrue(clone.deletions().isEmpty()); + assertFalse(clone.additions().isEmpty()); + } + + @Test + public void testRemoveAddition() { + ChangeRequest clone = CHANGE.toBuilder().removeAddition(RECORD1).build(); + assertTrue(clone.additions().contains(RECORD2)); + assertFalse(clone.additions().contains(RECORD1)); + assertTrue(clone.deletions().contains(RECORD3)); + clone = CHANGE.toBuilder().removeAddition(RECORD2).removeAddition(RECORD1).build(); + assertFalse(clone.additions().contains(RECORD2)); + assertFalse(clone.additions().contains(RECORD1)); + assertTrue(clone.additions().isEmpty()); + assertTrue(clone.deletions().contains(RECORD3)); + } + + @Test + public void testRemoveDeletion() { + ChangeRequest clone = CHANGE.toBuilder().removeDeletion(RECORD3).build(); + assertFalse(clone.deletions().contains(RECORD3)); + assertTrue(clone.deletions().isEmpty()); + } + + @Test + public void testDateParsing() { + String startTime = "2016-01-26T18:33:43.512Z"; // obtained from service + com.google.api.services.dns.model.Change change = CHANGE.toPb().setStartTime(startTime); + ChangeRequest converted = ChangeRequest.fromPb(change); + assertNotNull(converted.startTimeMillis()); + assertEquals(change, converted.toPb()); + assertEquals(change.getStartTime(), converted.toPb().getStartTime()); + } + + @Test + public void testStatusTranslation() { + assertEquals(ChangeRequest.Status.DONE, ChangeRequest.Status.translate("done")); + assertEquals(ChangeRequest.Status.PENDING, ChangeRequest.Status.translate("pending")); + try { + ChangeRequest.Status.translate("another"); + fail("Such a status does not exist."); + } catch (IllegalArgumentException e) { + // expected + } + } +} From 6f9e1c09b831b39def386076826eecf20daa1bc2 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Tue, 26 Jan 2016 17:15:14 -0800 Subject: [PATCH 14/50] Implements comments from @ajkannan and @aozarov. --- .../com/google/gcloud/dns/ChangeRequest.java | 126 ++++++++---------- .../java/com/google/gcloud/dns/DnsRecord.java | 8 +- .../google/gcloud/dns/ChangeRequestTest.java | 17 +-- .../com/google/gcloud/dns/DnsRecordTest.java | 2 +- 4 files changed, 62 insertions(+), 91 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java index 40c6ff0ad151..5ed03b1ea071 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java @@ -16,7 +16,12 @@ package com.google.gcloud.dns; +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.api.services.dns.model.ResourceRecordSet; +import com.google.common.base.Function; import com.google.common.base.MoreObjects; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import org.joda.time.DateTime; @@ -27,17 +32,29 @@ import java.util.List; import java.util.Objects; -import static com.google.common.base.Preconditions.checkNotNull; - /** - * A class representing a change. A change is an atomic update to a collection of {@link DnsRecord}s - * within a {@code ManagedZone}. + * A class representing an atomic update to a collection of {@link DnsRecord}s within a {@code + * ManagedZone}. * * @see Google Cloud DNS documentation */ public class ChangeRequest implements Serializable { - private static final long serialVersionUID = 201601251649L; + private static final Function FROM_PB_FUNCTION = + new Function() { + @Override + public DnsRecord apply(com.google.api.services.dns.model.ResourceRecordSet pb) { + return DnsRecord.fromPb(pb); + } + }; + private static final Function TO_PB_FUNCTION = + new Function() { + @Override + public com.google.api.services.dns.model.ResourceRecordSet apply(DnsRecord error) { + return error.toPb(); + } + }; + private static final long serialVersionUID = -8703939628990291682L; private final List additions; private final List deletions; private final String id; @@ -51,24 +68,8 @@ public class ChangeRequest implements Serializable { * documentation */ public enum Status { - PENDING("pending"), - DONE("done"); - - private final String status; - - Status(String status) { - this.status = status; - } - - static Status translate(String status) { - if ("pending".equals(status)) { - return PENDING; - } else if ("done".equals(status)) { - return DONE; - } else { - throw new IllegalArgumentException("Such a status is unknown."); - } - } + PENDING, + DONE } /** @@ -101,10 +102,19 @@ public Builder additions(List additions) { this.additions = Lists.newLinkedList(checkNotNull(additions)); return this; } + + /** + * Sets a collection of {@link DnsRecord}s which are to be deleted from the zone upon executing + * this {@code ChangeRequest}. + */ + public Builder deletions(List deletions) { + this.deletions = Lists.newLinkedList(checkNotNull(deletions)); + return this; + } /** - * Adds a {@link DnsRecord} which to be added to the zone upon executing this - * {@code ChangeRequest}. + * Adds a {@link DnsRecord} to be added to the zone upon executing this {@code + * ChangeRequest}. */ public Builder add(DnsRecord record) { this.additions.add(checkNotNull(record)); @@ -112,7 +122,7 @@ public Builder add(DnsRecord record) { } /** - * Adds a {@link DnsRecord} which to be deleted to the zone upon executing this + * Adds a {@link DnsRecord} to be deleted to the zone upon executing this * {@code ChangeRequest}. */ public Builder delete(DnsRecord record) { @@ -139,7 +149,7 @@ public Builder clearDeletions() { } /** - * Removes a single {@link DnsRecord} from the collection of of records to be + * Removes a single {@link DnsRecord} from the collection of records to be * added to the zone upon executing this {@code ChangeRequest}. */ public Builder removeAddition(DnsRecord record) { @@ -148,7 +158,7 @@ public Builder removeAddition(DnsRecord record) { } /** - * Removes a single {@link DnsRecord} from the collection of of records to be + * Removes a single {@link DnsRecord} from the collection of records to be * deleted from the zone upon executing this {@code ChangeRequest}. */ public Builder removeDeletion(DnsRecord record) { @@ -156,15 +166,6 @@ public Builder removeDeletion(DnsRecord record) { return this; } - /** - * Sets a collection of {@link DnsRecord}s which are to be deleted from the zone upon executing - * this {@code ChangeRequest}. - */ - public Builder deletions(List deletions) { - this.deletions = Lists.newLinkedList(checkNotNull(deletions)); - return this; - } - /** * Associates a server-assigned id to this {@code ChangeRequest}. */ @@ -199,8 +200,8 @@ public ChangeRequest build() { } private ChangeRequest(Builder builder) { - this.additions = builder.additions; - this.deletions = builder.deletions; + this.additions = ImmutableList.copyOf(builder.additions); + this.deletions = ImmutableList.copyOf(builder.deletions); this.id = builder.id; this.startTimeMillis = builder.startTimeMillis; this.status = builder.status; @@ -221,7 +222,7 @@ public Builder toBuilder() { } /** - * Returns the list of {@link DnsRecord}s to be added to the zone upon executing this {@code + * Returns the list of {@link DnsRecord}s to be added to the zone upon submitting this {@code * ChangeRequest}. */ public List additions() { @@ -229,7 +230,7 @@ public List additions() { } /** - * Returns the list of {@link DnsRecord}s to be deleted from the zone upon executing this {@code + * Returns the list of {@link DnsRecord}s to be deleted from the zone upon submitting this {@code * ChangeRequest}. */ public List deletions() { @@ -270,56 +271,39 @@ com.google.api.services.dns.model.Change toPb() { } // set status if (status() != null) { - pb.setStatus(status().status); + pb.setStatus(status().name().toLowerCase()); } // set a list of additions - if (additions() != null) { - LinkedList additionsPb = - new LinkedList<>(); - for (DnsRecord addition : additions()) { - additionsPb.add(addition.toPb()); - } - pb.setAdditions(additionsPb); - } + pb.setAdditions(Lists.transform(additions(), TO_PB_FUNCTION)); // set a list of deletions - if (deletions() != null) { - LinkedList deletionsPb = - new LinkedList<>(); - for (DnsRecord deletion : deletions()) { - deletionsPb.add(deletion.toPb()); - } - pb.setDeletions(deletionsPb); - } + pb.setDeletions(Lists.transform(deletions(), TO_PB_FUNCTION)); return pb; } static ChangeRequest fromPb(com.google.api.services.dns.model.Change pb) { - Builder b = builder(); + Builder builder = builder(); if (pb.getId() != null) { - b.id(pb.getId()); + builder.id(pb.getId()); } if (pb.getStartTime() != null) { - b.startTimeMillis(DateTime.parse(pb.getStartTime()).getMillis()); + builder.startTimeMillis(DateTime.parse(pb.getStartTime()).getMillis()); } if (pb.getStatus() != null) { - b.status(ChangeRequest.Status.translate(pb.getStatus())); + // we are assuming that status indicated in pb is a lower case version of the enum name + builder.status(ChangeRequest.Status.valueOf(pb.getStatus().toUpperCase())); } if (pb.getDeletions() != null) { - for (com.google.api.services.dns.model.ResourceRecordSet deletion : pb.getDeletions()) { - b.delete(DnsRecord.fromPb(deletion)); - } + builder.deletions(Lists.transform(pb.getDeletions(), FROM_PB_FUNCTION)); } if (pb.getAdditions() != null) { - for (com.google.api.services.dns.model.ResourceRecordSet addition : pb.getAdditions()) { - b.add(DnsRecord.fromPb(addition)); - } + builder.additions(Lists.transform(pb.getAdditions(), FROM_PB_FUNCTION)); } - return b.build(); + return builder.build(); } @Override - public boolean equals(Object o) { - return (o instanceof ChangeRequest) && this.toPb().equals(((ChangeRequest) o).toPb()); + public boolean equals(Object other) { + return (other instanceof ChangeRequest) && toPb().equals(((ChangeRequest) other).toPb()); } @Override diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index c41e72a77400..4236d9c1c561 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -273,14 +273,14 @@ com.google.api.services.dns.model.ResourceRecordSet toPb() { } static DnsRecord fromPb(com.google.api.services.dns.model.ResourceRecordSet pb) { - Builder b = builder(pb.getName(), Type.valueOf(pb.getType())); + Builder builder = builder(pb.getName(), Type.valueOf(pb.getType())); if (pb.getRrdatas() != null) { - b.records(pb.getRrdatas()); + builder.records(pb.getRrdatas()); } if (pb.getTtl() != null) { - b.ttl(pb.getTtl()); + builder.ttl(pb.getTtl()); } - return b.build(); + return builder.build(); } @Override diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ChangeRequestTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ChangeRequestTest.java index da8006da8b51..8b40a4dcff34 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ChangeRequestTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ChangeRequestTest.java @@ -159,7 +159,7 @@ public void testClearAdditions() { @Test public void testAddAddition() { try { - CHANGE.toBuilder().add(null).build(); + CHANGE.toBuilder().add(null); fail("Should not be able to add null DnsRecord."); } catch (NullPointerException e) { // expected @@ -171,7 +171,7 @@ public void testAddAddition() { @Test public void testAddDeletion() { try { - ChangeRequest clone = CHANGE.toBuilder().delete(null).build(); + CHANGE.toBuilder().delete(null); fail("Should not be able to delete null DnsRecord."); } catch (NullPointerException e) { // expected @@ -203,7 +203,6 @@ public void testRemoveAddition() { @Test public void testRemoveDeletion() { ChangeRequest clone = CHANGE.toBuilder().removeDeletion(RECORD3).build(); - assertFalse(clone.deletions().contains(RECORD3)); assertTrue(clone.deletions().isEmpty()); } @@ -216,16 +215,4 @@ public void testDateParsing() { assertEquals(change, converted.toPb()); assertEquals(change.getStartTime(), converted.toPb().getStartTime()); } - - @Test - public void testStatusTranslation() { - assertEquals(ChangeRequest.Status.DONE, ChangeRequest.Status.translate("done")); - assertEquals(ChangeRequest.Status.PENDING, ChangeRequest.Status.translate("pending")); - try { - ChangeRequest.Status.translate("another"); - fail("Such a status does not exist."); - } catch (IllegalArgumentException e) { - // expected - } - } } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java index 312cf564cbf2..60eb6f033ce0 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -17,9 +17,9 @@ package com.google.gcloud.dns; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import static org.junit.Assert.assertNotEquals; import org.junit.Test; From 9b4ff48b64c2192a42d914a672d9004e59a4b822 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Mon, 25 Jan 2016 16:23:48 -0800 Subject: [PATCH 15/50] Added ProjectInfo. --- .../com/google/gcloud/dns/ProjectInfo.java | 284 ++++++++++++++++++ .../google/gcloud/dns/ProjectInfoTest.java | 118 ++++++++ 2 files changed, 402 insertions(+) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java create mode 100644 gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java new file mode 100644 index 000000000000..614b9033a18e --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java @@ -0,0 +1,284 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.MoreObjects; + +import java.io.Serializable; +import java.math.BigInteger; +import java.util.Objects; + +/** + * The class that encapsulates information about a project in Google Cloud DNS. A project is a top + * level container for resources including {@link ManagedZone}s. Projects can be created only in the + * APIs console. + * + * @see Google Cloud DNS documentation + */ +public class ProjectInfo implements Serializable { + + private static final long serialVersionUID = 201601251420L; + private final String id; + private final BigInteger number; + private final Quota quota; + + /** + * This class represents quotas assigned to the {@code ProjectInfo}. + * + * @see Google Cloud DNS documentation + */ + public static class Quota { + + private Integer zones; + private Integer resourceRecordsPerRrset; + private Integer rrsetAdditionsPerChange; + private Integer rrsetDeletionsPerChange; + private Integer rrsetsPerManagedZone; + private Integer totalRrdataSizePerChange; + + /** + * Creates an instance of {@code Quota}. + * + * This is the only way of creating an instance of {@code Quota}. As the service does not allow + * for specifying options, quota is an "all-or-nothing object" and we do not need a builder. + */ + Quota(Integer zones, + Integer resourceRecordsPerRrset, + Integer rrsetAdditionsPerChange, + Integer rrsetDeletionsPerChange, + Integer rrsetsPerManagedZone, + Integer totalRrdataSizePerChange) { + this.zones = checkNotNull(zones); + this.resourceRecordsPerRrset = checkNotNull(resourceRecordsPerRrset); + this.rrsetAdditionsPerChange = checkNotNull(rrsetAdditionsPerChange); + this.rrsetDeletionsPerChange = checkNotNull(rrsetDeletionsPerChange); + this.rrsetsPerManagedZone = checkNotNull(rrsetsPerManagedZone); + this.totalRrdataSizePerChange = checkNotNull(totalRrdataSizePerChange); + } + + /** + * Returns the maximum allowed number of managed zones in the project. + */ + public Integer zones() { + return zones; + } + + /** + * Returns the maximum allowed number of records per {@link DnsRecord}. + */ + public Integer resourceRecordsPerRrset() { + return resourceRecordsPerRrset; + } + + /** + * Returns the maximum allowed number of {@link DnsRecord}s to add per {@code ChangesRequest}. + */ + public Integer rrsetAdditionsPerChange() { + return rrsetAdditionsPerChange; + } + + /** + * Returns the maximum allowed number of {@link DnsRecord}s to delete per {@code + * ChangesRequest}. + */ + public Integer rrsetDeletionsPerChange() { + return rrsetDeletionsPerChange; + } + + /** + * Returns the maximum allowed number of {@link DnsRecord}s per {@link ManagedZone} in the + * project. + */ + public Integer rrsetsPerManagedZone() { + return rrsetsPerManagedZone; + } + + /** + * Returns the maximum allowed size for total records in one ChangesRequest in bytes. + */ + public Integer totalRrdataSizePerChange() { + return totalRrdataSizePerChange; + } + + @Override + public boolean equals(Object o) { + return (o instanceof Quota) && this.toPb().equals(((Quota) o).toPb()); + } + + @Override + public int hashCode() { + return Objects.hash(zones, resourceRecordsPerRrset, rrsetAdditionsPerChange, + rrsetDeletionsPerChange, rrsetsPerManagedZone, totalRrdataSizePerChange); + } + + com.google.api.services.dns.model.Quota toPb() { + com.google.api.services.dns.model.Quota pb = new com.google.api.services.dns.model.Quota(); + pb.setManagedZones(zones); + pb.setResourceRecordsPerRrset(resourceRecordsPerRrset); + pb.setRrsetAdditionsPerChange(rrsetAdditionsPerChange); + pb.setRrsetDeletionsPerChange(rrsetDeletionsPerChange); + pb.setRrsetsPerManagedZone(rrsetsPerManagedZone); + pb.setTotalRrdataSizePerChange(totalRrdataSizePerChange); + return pb; + } + + static Quota fromPb(com.google.api.services.dns.model.Quota pb) { + Quota q = new Quota(pb.getManagedZones(), + pb.getResourceRecordsPerRrset(), + pb.getRrsetAdditionsPerChange(), + pb.getRrsetDeletionsPerChange(), + pb.getRrsetsPerManagedZone(), + pb.getTotalRrdataSizePerChange() + ); + return q; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("zones", zones) + .add("resourceRecordsPerRrset", resourceRecordsPerRrset) + .add("rrsetAdditionsPerChange", rrsetAdditionsPerChange) + .add("rrsetDeletionsPerChange", rrsetDeletionsPerChange) + .add("rrsetsPerManagedZone", rrsetsPerManagedZone) + .add("totalRrdataSizePerChange", totalRrdataSizePerChange) + .toString(); + } + } + + /** + * A builder for {@code ProjectInfo}. + */ + static class Builder { + private String id; + private BigInteger number; + private Quota quota; + + private Builder() { + } + + /** + * Sets an id of the project. + */ + Builder id(String id) { + this.id = checkNotNull(id); + return this; + } + + /** + * Sets a number of the project. + */ + Builder number(BigInteger number) { + this.number = checkNotNull(number); + return this; + } + + /** + * Sets quotas assigned to the project. + */ + Builder quota(Quota quota) { + this.quota = checkNotNull(quota); + return this; + } + + /** + * Builds an instance of the {@code ProjectInfo}. + */ + ProjectInfo build() { + return new ProjectInfo(this); + } + } + + private ProjectInfo(Builder b) { + this.id = b.id; + this.number = b.number; + this.quota = b.quota; + } + + /** + * Returns a builder for {@code ProjectInfo}. + */ + static Builder builder() { + return new Builder(); + } + + /** + * Returns the user-assigned unique identifier for the project. + */ + public String id() { + return id; + } + + /** + * Returns the unique numeric identifier for the project. + */ + public BigInteger number() { + return number; + } + + /** + * Returns the {@code Quota} object which contains quotas assigned to this project. + */ + public Quota quota() { + return quota; + } + + com.google.api.services.dns.model.Project toPb() { + com.google.api.services.dns.model.Project pb = new com.google.api.services.dns.model.Project(); + pb.setId(id()); + pb.setNumber(number()); + if (this.quota() != null) { + pb.setQuota(quota().toPb()); + } + return pb; + } + + static ProjectInfo fromPb(com.google.api.services.dns.model.Project pb) { + Builder b = builder(); + if (pb.getId() != null) { + b.id(pb.getId()); + } + if (pb.getNumber() != null) { + b.number(pb.getNumber()); + } + if (pb.getQuota() != null) { + b.quota(Quota.fromPb(pb.getQuota())); + } + return b.build(); + } + + @Override + public boolean equals(Object o) { + return (o instanceof ProjectInfo) && this.toPb().equals(((ProjectInfo) o).toPb()); + } + + @Override + public int hashCode() { + return Objects.hash(id, number, quota); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("id", id) + .add("number", number) + .add("quota", quota) + .toString(); + } +} diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java new file mode 100644 index 000000000000..2c5e1ffa7100 --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java @@ -0,0 +1,118 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; + +import java.math.BigInteger; + +public class ProjectInfoTest { + + private static final String ID = "project-id-123"; + private static final BigInteger NUMBER = new BigInteger("123"); + private static final ProjectInfo.Quota QUOTA = new ProjectInfo.Quota(1, 2, 3, 4, 5, 6); + private static final ProjectInfo PROJECT_INFO = ProjectInfo.builder() + .id(ID).number(NUMBER).quota(QUOTA).build(); + + @Test + public void testBuilder() { + ProjectInfo withId = ProjectInfo.builder().id(ID).build(); + assertEquals(ID, withId.id()); + assertNull(withId.number()); + assertNull(withId.quota()); + ProjectInfo withNumber = ProjectInfo.builder().number(NUMBER).build(); + assertEquals(NUMBER, withNumber.number()); + assertNull(withNumber.quota()); + assertNull(withNumber.id()); + ProjectInfo withQuota = ProjectInfo.builder().quota(QUOTA).build(); + assertEquals(QUOTA, withQuota.quota()); + assertNull(withQuota.id()); + assertNull(withQuota.number()); + assertEquals(QUOTA, PROJECT_INFO.quota()); + assertEquals(NUMBER, PROJECT_INFO.number()); + assertEquals(ID, PROJECT_INFO.id()); + } + + @Test + public void testQuotaConstructor() { + assertEquals(Integer.valueOf(1), QUOTA.zones()); + assertEquals(Integer.valueOf(2), QUOTA.resourceRecordsPerRrset()); + assertEquals(Integer.valueOf(3), QUOTA.rrsetAdditionsPerChange()); + assertEquals(Integer.valueOf(4), QUOTA.rrsetDeletionsPerChange()); + assertEquals(Integer.valueOf(5), QUOTA.rrsetsPerManagedZone()); + assertEquals(Integer.valueOf(6), QUOTA.totalRrdataSizePerChange()); + } + + @Test + public void testEqualsAndNotEqualsQuota() { + ProjectInfo.Quota clone = new ProjectInfo.Quota(6, 5, 4, 3, 2, 1); + assertNotEquals(QUOTA, clone); + clone = ProjectInfo.Quota.fromPb(QUOTA.toPb()); + assertEquals(QUOTA, clone); + } + + @Test + public void testSameHashCodeOnEqualsQuota() { + ProjectInfo.Quota clone = ProjectInfo.Quota.fromPb(QUOTA.toPb()); + assertEquals(QUOTA, clone); + assertEquals(QUOTA.hashCode(), clone.hashCode()); + } + + @Test + public void testEqualsAndNotEquals() { + ProjectInfo clone = ProjectInfo.builder().build(); + assertNotEquals(PROJECT_INFO, clone); + clone = ProjectInfo.builder().id(PROJECT_INFO.id()).number(PROJECT_INFO.number()).build(); + assertNotEquals(PROJECT_INFO, clone); + clone = ProjectInfo.builder().id(PROJECT_INFO.id()).quota(PROJECT_INFO.quota()).build(); + assertNotEquals(PROJECT_INFO, clone); + clone = ProjectInfo.builder().number(PROJECT_INFO.number()).quota(PROJECT_INFO.quota()).build(); + assertNotEquals(PROJECT_INFO, clone); + clone = ProjectInfo.fromPb(PROJECT_INFO.toPb()); + assertEquals(PROJECT_INFO, clone); + } + + @Test + public void testSameHashCodeOnEquals() { + ProjectInfo clone = ProjectInfo.fromPb(PROJECT_INFO.toPb()); + assertEquals(PROJECT_INFO, clone); + assertEquals(PROJECT_INFO.hashCode(), clone.hashCode()); + } + + @Test + public void testToAndFromPb() { + assertEquals(PROJECT_INFO, ProjectInfo.fromPb(PROJECT_INFO.toPb())); + ProjectInfo partial = ProjectInfo.builder().id(ID).build(); + assertEquals(partial, PROJECT_INFO.fromPb(partial.toPb())); + partial = ProjectInfo.builder().number(NUMBER).build(); + assertEquals(partial, PROJECT_INFO.fromPb(partial.toPb())); + partial = ProjectInfo.builder().quota(QUOTA).build(); + assertEquals(partial, PROJECT_INFO.fromPb(partial.toPb())); + assertNotEquals(PROJECT_INFO, partial); + } + + @Test + public void testToAndFromPbQuota() { + assertEquals(QUOTA, ProjectInfo.Quota.fromPb(QUOTA.toPb())); + ProjectInfo.Quota wrong = new ProjectInfo.Quota(5, 6, 3, 6, 2, 1); + assertNotEquals(QUOTA, ProjectInfo.Quota.fromPb(wrong.toPb())); + } +} From a47158db527eeb220534189ee24c7837f75bddda Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Wed, 27 Jan 2016 12:35:32 -0800 Subject: [PATCH 16/50] Fixed serialization, javadoc and checkstyle. --- .../com/google/gcloud/dns/ProjectInfo.java | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java index 614b9033a18e..dc9c2e6ef55e 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java @@ -26,14 +26,14 @@ /** * The class that encapsulates information about a project in Google Cloud DNS. A project is a top - * level container for resources including {@link ManagedZone}s. Projects can be created only in the + * level container for resources including {@code ManagedZone}s. Projects can be created only in the * APIs console. * * @see Google Cloud DNS documentation */ public class ProjectInfo implements Serializable { - private static final long serialVersionUID = 201601251420L; + private static final long serialVersionUID = 8696578863323485036L; private final String id; private final BigInteger number; private final Quota quota; @@ -55,8 +55,9 @@ public static class Quota { /** * Creates an instance of {@code Quota}. * - * This is the only way of creating an instance of {@code Quota}. As the service does not allow - * for specifying options, quota is an "all-or-nothing object" and we do not need a builder. + *

This is the only way of creating an instance of {@code Quota}. As the service does not + * allow for specifying options, quota is an "all-or-nothing object" and we do not need a + * builder. */ Quota(Integer zones, Integer resourceRecordsPerRrset, @@ -102,7 +103,7 @@ public Integer rrsetDeletionsPerChange() { } /** - * Returns the maximum allowed number of {@link DnsRecord}s per {@link ManagedZone} in the + * Returns the maximum allowed number of {@link DnsRecord}s per {@code ManagedZone} in the * project. */ public Integer rrsetsPerManagedZone() { @@ -117,8 +118,8 @@ public Integer totalRrdataSizePerChange() { } @Override - public boolean equals(Object o) { - return (o instanceof Quota) && this.toPb().equals(((Quota) o).toPb()); + public boolean equals(Object other) { + return (other instanceof Quota) && this.toPb().equals(((Quota) other).toPb()); } @Override @@ -139,14 +140,14 @@ com.google.api.services.dns.model.Quota toPb() { } static Quota fromPb(com.google.api.services.dns.model.Quota pb) { - Quota q = new Quota(pb.getManagedZones(), + Quota quota = new Quota(pb.getManagedZones(), pb.getResourceRecordsPerRrset(), pb.getRrsetAdditionsPerChange(), pb.getRrsetDeletionsPerChange(), pb.getRrsetsPerManagedZone(), pb.getTotalRrdataSizePerChange() ); - return q; + return quota; } @Override @@ -205,10 +206,10 @@ ProjectInfo build() { } } - private ProjectInfo(Builder b) { - this.id = b.id; - this.number = b.number; - this.quota = b.quota; + private ProjectInfo(Builder builder) { + this.id = builder.id; + this.number = builder.number; + this.quota = builder.quota; } /** @@ -250,22 +251,22 @@ com.google.api.services.dns.model.Project toPb() { } static ProjectInfo fromPb(com.google.api.services.dns.model.Project pb) { - Builder b = builder(); + Builder builder = builder(); if (pb.getId() != null) { - b.id(pb.getId()); + builder.id(pb.getId()); } if (pb.getNumber() != null) { - b.number(pb.getNumber()); + builder.number(pb.getNumber()); } if (pb.getQuota() != null) { - b.quota(Quota.fromPb(pb.getQuota())); + builder.quota(Quota.fromPb(pb.getQuota())); } - return b.build(); + return builder.build(); } @Override - public boolean equals(Object o) { - return (o instanceof ProjectInfo) && this.toPb().equals(((ProjectInfo) o).toPb()); + public boolean equals(Object other) { + return (other instanceof ProjectInfo) && this.toPb().equals(((ProjectInfo) other).toPb()); } @Override From 9db27d44a072233955a57670c4c77a8a1f72afca Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Wed, 27 Jan 2016 16:00:44 -0800 Subject: [PATCH 17/50] Implements comment from @aozarov and @ajkannan into ProjectInfo. --- .../com/google/gcloud/dns/ProjectInfo.java | 83 ++++++++++--------- .../google/gcloud/dns/ProjectInfoTest.java | 12 +-- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java index dc9c2e6ef55e..f8b2e33a1e9f 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java @@ -25,9 +25,9 @@ import java.util.Objects; /** - * The class that encapsulates information about a project in Google Cloud DNS. A project is a top - * level container for resources including {@code ManagedZone}s. Projects can be created only in the - * APIs console. + * The class provides the Google Cloud DNS information associated with this project. A project is a + * top level container for resources including {@code ManagedZone}s. Projects can be created only in + * the APIs console. * * @see Google Cloud DNS documentation */ @@ -41,16 +41,17 @@ public class ProjectInfo implements Serializable { /** * This class represents quotas assigned to the {@code ProjectInfo}. * - * @see Google Cloud DNS documentation + * @see Google Cloud DNS + * documentation */ public static class Quota { - private Integer zones; - private Integer resourceRecordsPerRrset; - private Integer rrsetAdditionsPerChange; - private Integer rrsetDeletionsPerChange; - private Integer rrsetsPerManagedZone; - private Integer totalRrdataSizePerChange; + private final int zones; + private final int resourceRecordsPerRrset; + private final int rrsetAdditionsPerChange; + private final int rrsetDeletionsPerChange; + private final int rrsetsPerManagedZone; + private final int totalRrdataSizePerChange; /** * Creates an instance of {@code Quota}. @@ -59,38 +60,38 @@ public static class Quota { * allow for specifying options, quota is an "all-or-nothing object" and we do not need a * builder. */ - Quota(Integer zones, - Integer resourceRecordsPerRrset, - Integer rrsetAdditionsPerChange, - Integer rrsetDeletionsPerChange, - Integer rrsetsPerManagedZone, - Integer totalRrdataSizePerChange) { - this.zones = checkNotNull(zones); - this.resourceRecordsPerRrset = checkNotNull(resourceRecordsPerRrset); - this.rrsetAdditionsPerChange = checkNotNull(rrsetAdditionsPerChange); - this.rrsetDeletionsPerChange = checkNotNull(rrsetDeletionsPerChange); - this.rrsetsPerManagedZone = checkNotNull(rrsetsPerManagedZone); - this.totalRrdataSizePerChange = checkNotNull(totalRrdataSizePerChange); + Quota(int zones, + int resourceRecordsPerRrset, + int rrsetAdditionsPerChange, + int rrsetDeletionsPerChange, + int rrsetsPerManagedZone, + int totalRrdataSizePerChange) { + this.zones = zones; + this.resourceRecordsPerRrset = resourceRecordsPerRrset; + this.rrsetAdditionsPerChange = rrsetAdditionsPerChange; + this.rrsetDeletionsPerChange = rrsetDeletionsPerChange; + this.rrsetsPerManagedZone = rrsetsPerManagedZone; + this.totalRrdataSizePerChange = totalRrdataSizePerChange; } /** * Returns the maximum allowed number of managed zones in the project. */ - public Integer zones() { + public int zones() { return zones; } /** * Returns the maximum allowed number of records per {@link DnsRecord}. */ - public Integer resourceRecordsPerRrset() { + public int resourceRecordsPerRrset() { return resourceRecordsPerRrset; } /** * Returns the maximum allowed number of {@link DnsRecord}s to add per {@code ChangesRequest}. */ - public Integer rrsetAdditionsPerChange() { + public int rrsetAdditionsPerChange() { return rrsetAdditionsPerChange; } @@ -98,7 +99,7 @@ public Integer rrsetAdditionsPerChange() { * Returns the maximum allowed number of {@link DnsRecord}s to delete per {@code * ChangesRequest}. */ - public Integer rrsetDeletionsPerChange() { + public int rrsetDeletionsPerChange() { return rrsetDeletionsPerChange; } @@ -106,14 +107,14 @@ public Integer rrsetDeletionsPerChange() { * Returns the maximum allowed number of {@link DnsRecord}s per {@code ManagedZone} in the * project. */ - public Integer rrsetsPerManagedZone() { + public int rrsetsPerManagedZone() { return rrsetsPerManagedZone; } /** * Returns the maximum allowed size for total records in one ChangesRequest in bytes. */ - public Integer totalRrdataSizePerChange() { + public int totalRrdataSizePerChange() { return totalRrdataSizePerChange; } @@ -220,32 +221,32 @@ static Builder builder() { } /** - * Returns the user-assigned unique identifier for the project. + * Returns the {@code Quota} object which contains quotas assigned to this project. */ - public String id() { - return id; + public Quota quota() { + return quota; } /** - * Returns the unique numeric identifier for the project. + * Returns project number. For internal use only. */ - public BigInteger number() { + BigInteger number() { return number; } /** - * Returns the {@code Quota} object which contains quotas assigned to this project. + * Returns project id. For internal use only. */ - public Quota quota() { - return quota; + String id() { + return id; } com.google.api.services.dns.model.Project toPb() { com.google.api.services.dns.model.Project pb = new com.google.api.services.dns.model.Project(); - pb.setId(id()); - pb.setNumber(number()); - if (this.quota() != null) { - pb.setQuota(quota().toPb()); + pb.setId(id); + pb.setNumber(number); + if (this.quota != null) { + pb.setQuota(quota.toPb()); } return pb; } @@ -266,7 +267,7 @@ static ProjectInfo fromPb(com.google.api.services.dns.model.Project pb) { @Override public boolean equals(Object other) { - return (other instanceof ProjectInfo) && this.toPb().equals(((ProjectInfo) other).toPb()); + return (other instanceof ProjectInfo) && toPb().equals(((ProjectInfo) other).toPb()); } @Override diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java index 2c5e1ffa7100..2af8b5ad3995 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java @@ -53,12 +53,12 @@ public void testBuilder() { @Test public void testQuotaConstructor() { - assertEquals(Integer.valueOf(1), QUOTA.zones()); - assertEquals(Integer.valueOf(2), QUOTA.resourceRecordsPerRrset()); - assertEquals(Integer.valueOf(3), QUOTA.rrsetAdditionsPerChange()); - assertEquals(Integer.valueOf(4), QUOTA.rrsetDeletionsPerChange()); - assertEquals(Integer.valueOf(5), QUOTA.rrsetsPerManagedZone()); - assertEquals(Integer.valueOf(6), QUOTA.totalRrdataSizePerChange()); + assertEquals(1, QUOTA.zones()); + assertEquals(2, QUOTA.resourceRecordsPerRrset()); + assertEquals(3, QUOTA.rrsetAdditionsPerChange()); + assertEquals(4, QUOTA.rrsetDeletionsPerChange()); + assertEquals(5, QUOTA.rrsetsPerManagedZone()); + assertEquals(6, QUOTA.totalRrdataSizePerChange()); } @Test From 4412c7304cda6bd5d3846161b6451740972bc929 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Wed, 27 Jan 2016 16:13:37 -0800 Subject: [PATCH 18/50] Changed documentation @code to @link where applicable. --- .../src/main/java/com/google/gcloud/dns/ProjectInfo.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java index f8b2e33a1e9f..e65524913920 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java @@ -89,22 +89,22 @@ public int resourceRecordsPerRrset() { } /** - * Returns the maximum allowed number of {@link DnsRecord}s to add per {@code ChangesRequest}. + * Returns the maximum allowed number of {@link DnsRecord}s to add per {@link ChangeRequest}. */ public int rrsetAdditionsPerChange() { return rrsetAdditionsPerChange; } /** - * Returns the maximum allowed number of {@link DnsRecord}s to delete per {@code - * ChangesRequest}. + * Returns the maximum allowed number of {@link DnsRecord}s to delete per {@link + * ChangeRequest}. */ public int rrsetDeletionsPerChange() { return rrsetDeletionsPerChange; } /** - * Returns the maximum allowed number of {@link DnsRecord}s per {@code ManagedZone} in the + * Returns the maximum allowed number of {@link DnsRecord}s per {@link ManagedZoneInfo} in the * project. */ public int rrsetsPerManagedZone() { From 81a46d8429909998bdbf65cdc0726e9a404d62b1 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Wed, 27 Jan 2016 18:01:27 -0800 Subject: [PATCH 19/50] Renames ManagedZone to Zone. Acommodates codecheck. Fixes #579. --- .../com/google/gcloud/dns/ChangeRequest.java | 4 +- .../java/com/google/gcloud/dns/DnsRecord.java | 4 +- .../com/google/gcloud/dns/ProjectInfo.java | 6 +- .../{ManagedZoneInfo.java => ZoneInfo.java} | 88 +++++++++---------- ...gedZoneInfoTest.java => ZoneInfoTest.java} | 62 ++++++------- 5 files changed, 80 insertions(+), 84 deletions(-) rename gcloud-java-dns/src/main/java/com/google/gcloud/dns/{ManagedZoneInfo.java => ZoneInfo.java} (70%) rename gcloud-java-dns/src/test/java/com/google/gcloud/dns/{ManagedZoneInfoTest.java => ZoneInfoTest.java} (72%) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java index 5ed03b1ea071..582dd2b2e05b 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java @@ -34,7 +34,7 @@ /** * A class representing an atomic update to a collection of {@link DnsRecord}s within a {@code - * ManagedZone}. + * Zone}. * * @see Google Cloud DNS documentation */ @@ -102,7 +102,7 @@ public Builder additions(List additions) { this.additions = Lists.newLinkedList(checkNotNull(additions)); return this; } - + /** * Sets a collection of {@link DnsRecord}s which are to be deleted from the zone upon executing * this {@code ChangeRequest}. diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index 4236d9c1c561..b9e8134d9921 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -33,8 +33,8 @@ * *

A {@code DnsRecord} is the unit of data that will be returned by the DNS servers upon a DNS * request for a specific domain. The {@code DnsRecord} holds the current state of the DNS records - * that make up a managed zone. You can read the records but you cannot modify them directly. - * Rather, you edit the records in a managed zone by creating a ChangeRequest. + * that make up a zone. You can read the records but you cannot modify them directly. + * Rather, you edit the records in a zone by creating a ChangeRequest. * * @see Google Cloud DNS * documentation diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java index e65524913920..b7933956ed88 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java @@ -26,7 +26,7 @@ /** * The class provides the Google Cloud DNS information associated with this project. A project is a - * top level container for resources including {@code ManagedZone}s. Projects can be created only in + * top level container for resources including {@code Zone}s. Projects can be created only in * the APIs console. * * @see Google Cloud DNS documentation @@ -75,7 +75,7 @@ public static class Quota { } /** - * Returns the maximum allowed number of managed zones in the project. + * Returns the maximum allowed number of zones in the project. */ public int zones() { return zones; @@ -104,7 +104,7 @@ public int rrsetDeletionsPerChange() { } /** - * Returns the maximum allowed number of {@link DnsRecord}s per {@link ManagedZoneInfo} in the + * Returns the maximum allowed number of {@link DnsRecord}s per {@link ZoneInfo} in the * project. */ public int rrsetsPerManagedZone() { diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java similarity index 70% rename from gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java rename to gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java index d27e134ad908..3e8afd9a30f9 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ManagedZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java @@ -32,12 +32,12 @@ import java.util.Objects; /** - * A {@code ManagedZone} represents a DNS zone hosted by the Google Cloud DNS service. A zone is a - * subtree of the DNS namespace under one administrative responsibility. See Google Cloud DNS documentation for * more information. */ -public class ManagedZoneInfo implements Serializable { +public class ZoneInfo implements Serializable { private static final long serialVersionUID = 201601191647L; private final String name; @@ -49,7 +49,7 @@ public class ManagedZoneInfo implements Serializable { private final List nameServers; /** - * A builder for {@code ManagedZoneInfo}. + * A builder for {@code ZoneInfo}. */ public static class Builder { private String name; @@ -61,8 +61,7 @@ public static class Builder { private List nameServers = new LinkedList<>(); /** - * Returns an empty builder for {@code ManagedZoneInfo}. We use it internally in {@code - * toPb()}. + * Returns an empty builder for {@code ZoneInfo}. We use it internally in {@code toPb()}. */ private Builder() { } @@ -81,9 +80,9 @@ private Builder(String name, BigInteger id) { } /** - * Creates a builder from an existing ManagedZoneInfo object. + * Creates a builder from an existing ZoneInfo object. */ - Builder(ManagedZoneInfo info) { + Builder(ZoneInfo info) { this.name = info.name; this.id = info.id; this.creationTimeMillis = info.creationTimeMillis; @@ -102,7 +101,7 @@ public Builder name(String name) { } /** - * Sets an id for the managed zone which is assigned to the managed zone by the server. + * Sets an id for the zone which is assigned to the zone by the server. */ Builder id(BigInteger id) { this.id = id; @@ -110,7 +109,7 @@ Builder id(BigInteger id) { } /** - * Sets the time when this managed zone was created. + * Sets the time when this zone was created. */ Builder creationTimeMillis(long creationTimeMillis) { this.creationTimeMillis = creationTimeMillis; @@ -118,7 +117,7 @@ Builder creationTimeMillis(long creationTimeMillis) { } /** - * Sets a mandatory DNS name of this managed zone, for instance "example.com.". + * Sets a mandatory DNS name of this zone, for instance "example.com.". */ public Builder dnsName(String dnsName) { this.dnsName = checkNotNull(dnsName); @@ -126,8 +125,8 @@ public Builder dnsName(String dnsName) { } /** - * Sets a mandatory description for this managed zone. The value is a string of at most 1024 - * characters which has no effect on the managed zone's function. + * Sets a mandatory description for this zone. The value is a string of at most 1024 characters + * which has no effect on the zone's function. */ public Builder description(String description) { this.description = checkNotNull(description); @@ -135,9 +134,8 @@ public Builder description(String description) { } /** - * Optionally specifies the NameServerSet for this managed zone. A NameServerSet is a set of DNS - * name servers that all host the same ManagedZones. Most users will not need to specify this - * value. + * Optionally specifies the NameServerSet for this zone. A NameServerSet is a set of DNS name + * servers that all host the same zones. Most users will not need to specify this value. */ public Builder nameServerSet(String nameServerSet) { // todo(mderka) add more to the doc when questions are answered by the service owner @@ -146,8 +144,8 @@ public Builder nameServerSet(String nameServerSet) { } /** - * Sets a list of servers that hold the information about the managed zone. This information is - * provided by Google Cloud DNS and is read only. + * Sets a list of servers that hold the information about the zone. This information is provided + * by Google Cloud DNS and is read only. */ Builder nameServers(List nameServers) { checkNotNull(nameServers); @@ -156,14 +154,14 @@ Builder nameServers(List nameServers) { } /** - * Builds the instance of {@code ManagedZoneInfo} based on the information set by this builder. + * Builds the instance of {@code ZoneInfo} based on the information set by this builder. */ - public ManagedZoneInfo build() { - return new ManagedZoneInfo(this); + public ZoneInfo build() { + return new ZoneInfo(this); } } - private ManagedZoneInfo(Builder builder) { + private ZoneInfo(Builder builder) { this.name = builder.name; this.id = builder.id; this.creationTimeMillis = builder.creationTimeMillis; @@ -174,63 +172,63 @@ private ManagedZoneInfo(Builder builder) { } /** - * Returns a builder for {@code ManagedZoneInfo} with an assigned {@code name}. + * Returns a builder for {@code ZoneInfo} with an assigned {@code name}. */ public static Builder builder(String name) { return new Builder(name); } /** - * Returns a builder for {@code ManagedZoneInfo} with an assigned {@code id}. + * Returns a builder for {@code ZoneInfo} with an assigned {@code id}. */ public static Builder builder(BigInteger id) { return new Builder(id); } /** - * Returns a builder for {@code ManagedZoneInfo} with an assigned {@code name} and {@code id}. + * Returns a builder for {@code ZoneInfo} with an assigned {@code name} and {@code id}. */ public static Builder builder(String name, BigInteger id) { return new Builder(name, id); } /** - * Returns the user-defined name of the managed zone. + * Returns the user-defined name of the zone. */ public String name() { return name; } /** - * Returns the read-only managed zone id assigned by the server. + * Returns the read-only zone id assigned by the server. */ public BigInteger id() { return id; } /** - * Returns the time when this time that this managed zone was created on the server. + * Returns the time when this time that this zone was created on the server. */ public Long creationTimeMillis() { return creationTimeMillis; } /** - * Returns the DNS name of this managed zone, for instance "example.com.". + * Returns the DNS name of this zone, for instance "example.com.". */ public String dnsName() { return dnsName; } /** - * Returns the description of this managed zone. + * Returns the description of this zone. */ public String description() { return description; } /** - * Returns the optionally specified set of DNS name servers that all host this managed zone. + * Returns the optionally specified set of DNS name servers that all host this zone. */ public String nameServerSet() { // todo(mderka) update this doc after finding out more about this from the service owners @@ -238,16 +236,14 @@ public String nameServerSet() { } /** - * The nameservers that the managed zone should be delegated to. This is defined by the Google DNS - * cloud. + * The nameservers that the zone should be delegated to. This is defined by the Google DNS cloud. */ public List nameServers() { return nameServers; } /** - * Returns a builder for {@code ManagedZoneInfo} prepopulated with the metadata of this managed - * zone. + * Returns a builder for {@code ZoneInfo} prepopulated with the metadata of this zone. */ public Builder toBuilder() { return new Builder(this); @@ -272,35 +268,35 @@ com.google.api.services.dns.model.ManagedZone toPb() { return pb; } - static ManagedZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) { - Builder b = new Builder(); + static ZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) { + Builder builder = new Builder(); if (pb.getDescription() != null) { - b.description(pb.getDescription()); + builder.description(pb.getDescription()); } if (pb.getDnsName() != null) { - b.dnsName(pb.getDnsName()); + builder.dnsName(pb.getDnsName()); } if (pb.getId() != null) { - b.id(pb.getId()); + builder.id(pb.getId()); } if (pb.getName() != null) { - b.name(pb.getName()); + builder.name(pb.getName()); } if (pb.getNameServers() != null) { - b.nameServers(pb.getNameServers()); + builder.nameServers(pb.getNameServers()); } if (pb.getNameServerSet() != null) { - b.nameServerSet(pb.getNameServerSet()); + builder.nameServerSet(pb.getNameServerSet()); } if (pb.getCreationTime() != null) { - b.creationTimeMillis(DateTime.parse(pb.getCreationTime()).getMillis()); + builder.creationTimeMillis(DateTime.parse(pb.getCreationTime()).getMillis()); } - return b.build(); + return builder.build(); } @Override public boolean equals(Object obj) { - return obj instanceof ManagedZoneInfo && Objects.equals(toPb(), ((ManagedZoneInfo) obj).toPb()); + return obj instanceof ZoneInfo && Objects.equals(toPb(), ((ZoneInfo) obj).toPb()); } @Override diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneInfoTest.java similarity index 72% rename from gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java rename to gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneInfoTest.java index 936164c81723..2c9fea8f7bde 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ManagedZoneInfoTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneInfoTest.java @@ -30,7 +30,7 @@ import java.util.LinkedList; import java.util.List; -public class ManagedZoneInfoTest { +public class ZoneInfoTest { private static final String NAME = "mz-example.com"; private static final BigInteger ID = BigInteger.valueOf(123L); @@ -42,7 +42,7 @@ public class ManagedZoneInfoTest { private static final String NS2 = "name server 2"; private static final String NS3 = "name server 3"; private static final List NAME_SERVERS = ImmutableList.of(NS1, NS2, NS3); - private static final ManagedZoneInfo INFO = ManagedZoneInfo.builder(NAME, ID) + private static final ZoneInfo INFO = ZoneInfo.builder(NAME, ID) .creationTimeMillis(CREATION_TIME_MILLIS) .dnsName(DNS_NAME) .description(DESCRIPTION) @@ -52,7 +52,7 @@ public class ManagedZoneInfoTest { @Test public void testDefaultBuilders() { - ManagedZoneInfo withName = ManagedZoneInfo.builder(NAME).build(); + ZoneInfo withName = ZoneInfo.builder(NAME).build(); assertTrue(withName.nameServers().isEmpty()); assertEquals(NAME, withName.name()); assertNull(withName.id()); @@ -60,7 +60,7 @@ public void testDefaultBuilders() { assertNull(withName.nameServerSet()); assertNull(withName.description()); assertNull(withName.dnsName()); - ManagedZoneInfo withId = ManagedZoneInfo.builder(ID).build(); + ZoneInfo withId = ZoneInfo.builder(ID).build(); assertTrue(withId.nameServers().isEmpty()); assertEquals(ID, withId.id()); assertNull(withId.name()); @@ -68,7 +68,7 @@ public void testDefaultBuilders() { assertNull(withId.nameServerSet()); assertNull(withId.description()); assertNull(withId.dnsName()); - ManagedZoneInfo withBoth = ManagedZoneInfo.builder(NAME, ID).build(); + ZoneInfo withBoth = ZoneInfo.builder(NAME, ID).build(); assertTrue(withBoth.nameServers().isEmpty()); assertEquals(ID, withBoth.id()); assertEquals(NAME, withBoth.name()); @@ -94,7 +94,7 @@ public void testBuilder() { @Test public void testEqualsAndNotEquals() { - ManagedZoneInfo clone = INFO.toBuilder().build(); + ZoneInfo clone = INFO.toBuilder().build(); assertEquals(INFO, clone); List moreServers = Lists.newLinkedList(NAME_SERVERS); moreServers.add(NS1); @@ -118,55 +118,55 @@ public void testEqualsAndNotEquals() { @Test public void testSameHashCodeOnEquals() { int hash = INFO.hashCode(); - ManagedZoneInfo clone = INFO.toBuilder().build(); + ZoneInfo clone = INFO.toBuilder().build(); assertEquals(clone.hashCode(), hash); } @Test public void testToBuilder() { assertEquals(INFO, INFO.toBuilder().build()); - ManagedZoneInfo partial = ManagedZoneInfo.builder(NAME).build(); + ZoneInfo partial = ZoneInfo.builder(NAME).build(); assertEquals(partial, partial.toBuilder().build()); - partial = ManagedZoneInfo.builder(ID).build(); + partial = ZoneInfo.builder(ID).build(); assertEquals(partial, partial.toBuilder().build()); - partial = ManagedZoneInfo.builder(NAME).description(DESCRIPTION).build(); + partial = ZoneInfo.builder(NAME).description(DESCRIPTION).build(); assertEquals(partial, partial.toBuilder().build()); - partial = ManagedZoneInfo.builder(NAME).dnsName(DNS_NAME).build(); + partial = ZoneInfo.builder(NAME).dnsName(DNS_NAME).build(); assertEquals(partial, partial.toBuilder().build()); - partial = ManagedZoneInfo.builder(NAME).creationTimeMillis(CREATION_TIME_MILLIS).build(); + partial = ZoneInfo.builder(NAME).creationTimeMillis(CREATION_TIME_MILLIS).build(); assertEquals(partial, partial.toBuilder().build()); List nameServers = new LinkedList<>(); nameServers.add(NS1); - partial = ManagedZoneInfo.builder(NAME).nameServers(nameServers).build(); + partial = ZoneInfo.builder(NAME).nameServers(nameServers).build(); assertEquals(partial, partial.toBuilder().build()); - partial = ManagedZoneInfo.builder(NAME).nameServerSet(NAME_SERVER_SET).build(); + partial = ZoneInfo.builder(NAME).nameServerSet(NAME_SERVER_SET).build(); assertEquals(partial, partial.toBuilder().build()); } @Test public void testToAndFromPb() { - assertEquals(INFO, ManagedZoneInfo.fromPb(INFO.toPb())); - ManagedZoneInfo partial = ManagedZoneInfo.builder(NAME).build(); - assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); - partial = ManagedZoneInfo.builder(ID).build(); - assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); - partial = ManagedZoneInfo.builder(NAME).description(DESCRIPTION).build(); - assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); - partial = ManagedZoneInfo.builder(NAME).dnsName(DNS_NAME).build(); - assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); - partial = ManagedZoneInfo.builder(NAME).creationTimeMillis(CREATION_TIME_MILLIS).build(); - assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); + assertEquals(INFO, ZoneInfo.fromPb(INFO.toPb())); + ZoneInfo partial = ZoneInfo.builder(NAME).build(); + assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); + partial = ZoneInfo.builder(ID).build(); + assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); + partial = ZoneInfo.builder(NAME).description(DESCRIPTION).build(); + assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); + partial = ZoneInfo.builder(NAME).dnsName(DNS_NAME).build(); + assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); + partial = ZoneInfo.builder(NAME).creationTimeMillis(CREATION_TIME_MILLIS).build(); + assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); List nameServers = new LinkedList<>(); nameServers.add(NS1); - partial = ManagedZoneInfo.builder(NAME).nameServers(nameServers).build(); - assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); - partial = ManagedZoneInfo.builder(NAME).nameServerSet(NAME_SERVER_SET).build(); - assertEquals(partial, ManagedZoneInfo.fromPb(partial.toPb())); + partial = ZoneInfo.builder(NAME).nameServers(nameServers).build(); + assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); + partial = ZoneInfo.builder(NAME).nameServerSet(NAME_SERVER_SET).build(); + assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); } @Test public void testEmptyNameServers() { - ManagedZoneInfo clone = INFO.toBuilder().nameServers(new LinkedList()).build(); + ZoneInfo clone = INFO.toBuilder().nameServers(new LinkedList()).build(); assertTrue(clone.nameServers().isEmpty()); clone.toPb(); // test that this is allowed } @@ -175,7 +175,7 @@ public void testEmptyNameServers() { public void testDateParsing() { com.google.api.services.dns.model.ManagedZone pb = INFO.toPb(); pb.setCreationTime("2016-01-19T18:00:12.854Z"); // a real value obtained from Google Cloud DNS - ManagedZoneInfo mz = ManagedZoneInfo.fromPb(pb); // parses the string timestamp to millis + ZoneInfo mz = ZoneInfo.fromPb(pb); // parses the string timestamp to millis com.google.api.services.dns.model.ManagedZone pbClone = mz.toPb(); // converts it back to string assertEquals(pb, pbClone); assertEquals(pb.getCreationTime(), pbClone.getCreationTime()); From c364ff322187be6404c1a9cd0e1673b8f64a7c35 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 28 Jan 2016 09:30:55 -0800 Subject: [PATCH 20/50] Modified ttl to accept time unit. Fixed #581. --- .../java/com/google/gcloud/dns/DnsRecord.java | 30 +++++++++----- .../com/google/gcloud/dns/DnsRecordTest.java | 39 ++++++++++++------- 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index b9e8134d9921..a3a673b99cc6 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -27,14 +27,15 @@ import java.util.LinkedList; import java.util.List; import java.util.Objects; +import java.util.concurrent.TimeUnit; /** * A class that represents a Google Cloud DNS record set. * *

A {@code DnsRecord} is the unit of data that will be returned by the DNS servers upon a DNS * request for a specific domain. The {@code DnsRecord} holds the current state of the DNS records - * that make up a zone. You can read the records but you cannot modify them directly. - * Rather, you edit the records in a zone by creating a ChangeRequest. + * that make up a zone. You can read the records but you cannot modify them directly. Rather, you + * edit the records in a zone by creating a ChangeRequest. * * @see Google Cloud DNS * documentation @@ -44,7 +45,7 @@ public class DnsRecord implements Serializable { private static final long serialVersionUID = 2016011914302204L; private final String name; private final List rrdatas; - private final Integer ttl; + private final Integer ttl; // this is in seconds private final Type type; /** @@ -176,14 +177,23 @@ public Builder name(String name) { } /** - * Sets the number of seconds that this record can be cached by resolvers. This number must be - * non-negative. + * Sets the time that this record can be cached by resolvers. This number must be non-negative. + * The maximum duration must be equivalent to at most {@link Integer#MAX_VALUE} seconds. * - * @param ttl A non-negative number of seconds + * @param duration A non-negative number of time units + * @param unit The unit of the ttl parameter */ - public Builder ttl(int ttl) { - checkArgument(ttl >= 0, "TTL cannot be negative. The supplied value was %s.", ttl); - this.ttl = ttl; + public Builder ttl(int duration, TimeUnit unit) { + checkArgument(duration >= 0, + "Duration cannot be negative. The supplied value was %s.", duration); + checkNotNull(unit); + // convert to seconds and check that we are not overflowing int + // we cannot do that because pb does not support it + long converted = unit.toSeconds(duration); + checkArgument(converted <= Integer.MAX_VALUE, + "The duration converted to seconds is out of range of int. The value converts to %s sec.", + converted); + ttl = (int) converted; return this; } @@ -278,7 +288,7 @@ static DnsRecord fromPb(com.google.api.services.dns.model.ResourceRecordSet pb) builder.records(pb.getRrdatas()); } if (pb.getTtl() != null) { - builder.ttl(pb.getTtl()); + builder.ttl(pb.getTtl(), TimeUnit.SECONDS); } return builder.build(); } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java index 7a7daf8aac3c..5fc972cede78 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsRecordTest.java @@ -16,6 +16,7 @@ package com.google.gcloud.dns; +import static com.google.gcloud.dns.DnsRecord.builder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; @@ -23,18 +24,22 @@ import org.junit.Test; +import java.util.concurrent.TimeUnit; + public class DnsRecordTest { private static final String NAME = "example.com."; private static final Integer TTL = 3600; + private static final TimeUnit UNIT = TimeUnit.HOURS; + private static final Integer UNIT_TTL = 1; private static final DnsRecord.Type TYPE = DnsRecord.Type.AAAA; - private static final DnsRecord record = DnsRecord.builder(NAME, TYPE) - .ttl(TTL) + private static final DnsRecord record = builder(NAME, TYPE) + .ttl(UNIT_TTL, UNIT) .build(); @Test public void testDefaultDnsRecord() { - DnsRecord record = DnsRecord.builder(NAME, TYPE).build(); + DnsRecord record = builder(NAME, TYPE).build(); assertEquals(0, record.records().size()); assertEquals(TYPE, record.type()); assertEquals(NAME, record.name()); @@ -61,13 +66,21 @@ public void testBuilder() { @Test public void testValidTtl() { try { - DnsRecord.builder(NAME, TYPE).ttl(-1); + builder(NAME, TYPE).ttl(-1, TimeUnit.SECONDS); fail("A negative value is not acceptable for ttl."); } catch (IllegalArgumentException e) { // expected } - DnsRecord.builder(NAME, TYPE).ttl(0); - DnsRecord.builder(NAME, TYPE).ttl(Integer.MAX_VALUE); + builder(NAME, TYPE).ttl(0, TimeUnit.SECONDS); + builder(NAME, TYPE).ttl(Integer.MAX_VALUE, TimeUnit.SECONDS); + try { + builder(NAME, TYPE).ttl(Integer.MAX_VALUE, TimeUnit.HOURS); + fail("This value is too large for int."); + } catch (IllegalArgumentException e) { + // expected + } + DnsRecord record = DnsRecord.builder(NAME, TYPE).ttl(UNIT_TTL, UNIT).build(); + assertEquals(TTL, record.ttl()); } @Test @@ -79,7 +92,7 @@ public void testEqualsAndNotEquals() { String differentName = "totally different name"; clone = record.toBuilder().name(differentName).build(); assertNotEquals(record, clone); - clone = record.toBuilder().ttl(record.ttl() + 1).build(); + clone = record.toBuilder().ttl(record.ttl() + 1, TimeUnit.SECONDS).build(); assertNotEquals(record, clone); clone = record.toBuilder().type(DnsRecord.Type.TXT).build(); assertNotEquals(record, clone); @@ -95,22 +108,22 @@ public void testSameHashCodeOnEquals() { @Test public void testToAndFromPb() { assertEquals(record, DnsRecord.fromPb(record.toPb())); - DnsRecord partial = DnsRecord.builder(NAME, TYPE).build(); + DnsRecord partial = builder(NAME, TYPE).build(); assertEquals(partial, DnsRecord.fromPb(partial.toPb())); - partial = DnsRecord.builder(NAME, TYPE).addRecord("test").build(); + partial = builder(NAME, TYPE).addRecord("test").build(); assertEquals(partial, DnsRecord.fromPb(partial.toPb())); - partial = DnsRecord.builder(NAME, TYPE).ttl(15).build(); + partial = builder(NAME, TYPE).ttl(15, TimeUnit.SECONDS).build(); assertEquals(partial, DnsRecord.fromPb(partial.toPb())); } @Test public void testToBuilder() { assertEquals(record, record.toBuilder().build()); - DnsRecord partial = DnsRecord.builder(NAME, TYPE).build(); + DnsRecord partial = builder(NAME, TYPE).build(); assertEquals(partial, partial.toBuilder().build()); - partial = DnsRecord.builder(NAME, TYPE).addRecord("test").build(); + partial = builder(NAME, TYPE).addRecord("test").build(); assertEquals(partial, partial.toBuilder().build()); - partial = DnsRecord.builder(NAME, TYPE).ttl(15).build(); + partial = builder(NAME, TYPE).ttl(15, TimeUnit.SECONDS).build(); assertEquals(partial, partial.toBuilder().build()); } From 7bcff48454c09e73ab94b1b995563e390200d081 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 28 Jan 2016 10:27:21 -0800 Subject: [PATCH 21/50] Implemented comments by @aozarov. --- .../java/com/google/gcloud/dns/DnsRecord.java | 9 +++------ .../java/com/google/gcloud/dns/ProjectInfo.java | 16 ++++++++-------- .../java/com/google/gcloud/dns/ZoneInfo.java | 2 +- .../com/google/gcloud/dns/ProjectInfoTest.java | 8 ++++---- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index a3a673b99cc6..99ca20386419 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -22,6 +22,7 @@ import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import com.google.common.primitives.Ints; import java.io.Serializable; import java.util.LinkedList; @@ -187,13 +188,9 @@ public Builder ttl(int duration, TimeUnit unit) { checkArgument(duration >= 0, "Duration cannot be negative. The supplied value was %s.", duration); checkNotNull(unit); - // convert to seconds and check that we are not overflowing int - // we cannot do that because pb does not support it + // we cannot have long because pb does not support it long converted = unit.toSeconds(duration); - checkArgument(converted <= Integer.MAX_VALUE, - "The duration converted to seconds is out of range of int. The value converts to %s sec.", - converted); - ttl = (int) converted; + ttl = Ints.checkedCast(converted); return this; } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java index b7933956ed88..4db0497946b1 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java @@ -50,7 +50,7 @@ public static class Quota { private final int resourceRecordsPerRrset; private final int rrsetAdditionsPerChange; private final int rrsetDeletionsPerChange; - private final int rrsetsPerManagedZone; + private final int rrsetsPerZone; private final int totalRrdataSizePerChange; /** @@ -64,13 +64,13 @@ public static class Quota { int resourceRecordsPerRrset, int rrsetAdditionsPerChange, int rrsetDeletionsPerChange, - int rrsetsPerManagedZone, + int rrsetsPerZone, int totalRrdataSizePerChange) { this.zones = zones; this.resourceRecordsPerRrset = resourceRecordsPerRrset; this.rrsetAdditionsPerChange = rrsetAdditionsPerChange; this.rrsetDeletionsPerChange = rrsetDeletionsPerChange; - this.rrsetsPerManagedZone = rrsetsPerManagedZone; + this.rrsetsPerZone = rrsetsPerZone; this.totalRrdataSizePerChange = totalRrdataSizePerChange; } @@ -107,8 +107,8 @@ public int rrsetDeletionsPerChange() { * Returns the maximum allowed number of {@link DnsRecord}s per {@link ZoneInfo} in the * project. */ - public int rrsetsPerManagedZone() { - return rrsetsPerManagedZone; + public int rrsetsPerZone() { + return rrsetsPerZone; } /** @@ -126,7 +126,7 @@ public boolean equals(Object other) { @Override public int hashCode() { return Objects.hash(zones, resourceRecordsPerRrset, rrsetAdditionsPerChange, - rrsetDeletionsPerChange, rrsetsPerManagedZone, totalRrdataSizePerChange); + rrsetDeletionsPerChange, rrsetsPerZone, totalRrdataSizePerChange); } com.google.api.services.dns.model.Quota toPb() { @@ -135,7 +135,7 @@ com.google.api.services.dns.model.Quota toPb() { pb.setResourceRecordsPerRrset(resourceRecordsPerRrset); pb.setRrsetAdditionsPerChange(rrsetAdditionsPerChange); pb.setRrsetDeletionsPerChange(rrsetDeletionsPerChange); - pb.setRrsetsPerManagedZone(rrsetsPerManagedZone); + pb.setRrsetsPerManagedZone(rrsetsPerZone); pb.setTotalRrdataSizePerChange(totalRrdataSizePerChange); return pb; } @@ -158,7 +158,7 @@ public String toString() { .add("resourceRecordsPerRrset", resourceRecordsPerRrset) .add("rrsetAdditionsPerChange", rrsetAdditionsPerChange) .add("rrsetDeletionsPerChange", rrsetDeletionsPerChange) - .add("rrsetsPerManagedZone", rrsetsPerManagedZone) + .add("rrsetsPerZone", rrsetsPerZone) .add("totalRrdataSizePerChange", totalRrdataSizePerChange) .toString(); } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java index 3e8afd9a30f9..524309eaa8e9 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java @@ -207,7 +207,7 @@ public BigInteger id() { } /** - * Returns the time when this time that this zone was created on the server. + * Returns the time when this zone was created on the server. */ public Long creationTimeMillis() { return creationTimeMillis; diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java index 2af8b5ad3995..d959d44d4351 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ProjectInfoTest.java @@ -57,7 +57,7 @@ public void testQuotaConstructor() { assertEquals(2, QUOTA.resourceRecordsPerRrset()); assertEquals(3, QUOTA.rrsetAdditionsPerChange()); assertEquals(4, QUOTA.rrsetDeletionsPerChange()); - assertEquals(5, QUOTA.rrsetsPerManagedZone()); + assertEquals(5, QUOTA.rrsetsPerZone()); assertEquals(6, QUOTA.totalRrdataSizePerChange()); } @@ -101,11 +101,11 @@ public void testSameHashCodeOnEquals() { public void testToAndFromPb() { assertEquals(PROJECT_INFO, ProjectInfo.fromPb(PROJECT_INFO.toPb())); ProjectInfo partial = ProjectInfo.builder().id(ID).build(); - assertEquals(partial, PROJECT_INFO.fromPb(partial.toPb())); + assertEquals(partial, ProjectInfo.fromPb(partial.toPb())); partial = ProjectInfo.builder().number(NUMBER).build(); - assertEquals(partial, PROJECT_INFO.fromPb(partial.toPb())); + assertEquals(partial, ProjectInfo.fromPb(partial.toPb())); partial = ProjectInfo.builder().quota(QUOTA).build(); - assertEquals(partial, PROJECT_INFO.fromPb(partial.toPb())); + assertEquals(partial, ProjectInfo.fromPb(partial.toPb())); assertNotEquals(PROJECT_INFO, partial); } From f9b6f6a4762484da32ceee58e5281f1d615a1a12 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 28 Jan 2016 15:55:06 -0800 Subject: [PATCH 22/50] Added DnsService interface. --- .../com/google/gcloud/dns/DnsService.java | 507 ++++++++++++++++++ 1 file changed, 507 insertions(+) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java new file mode 100644 index 000000000000..694b0b288154 --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java @@ -0,0 +1,507 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import com.google.common.base.Joiner; +import com.google.common.collect.Sets; +import com.google.gcloud.spi.DnsServiceRpc; + +import java.io.Serializable; +import java.util.Set; + +/** + * An interface for the Google Cloud DNS service. + * + * @see Google Cloud DNS + */ +public interface DnsService extends Service { + + /** + * The fields of a project. + * + *

These values can be used to specify the fields to include in a partial response when calling + * {@code DnsService#getProjectInfo(ProjectOptions...)}. Project ID is always returned, even if + * not specified. + */ + enum ProjectField { + PROJECT_ID("id"), + PROJECT_NUMBER("number"), + QUOTA("quota"); + + private final String selector; + + ProjectField(String selector) { + this.selector = selector; + } + + public String selector() { + return selector; + } + + static String selector(ProjectField... fields) { + Set fieldStrings = Sets.newHashSetWithExpectedSize(fields.length + 1); + fieldStrings.add(PROJECT_ID.selector()); + for (ProjectField field : fields) { + fieldStrings.add(field.selector()); + } + return Joiner.on(',').join(fieldStrings); + } + } + + /** + * The fields of a zone. + * + *

These values can be used to specify the fields to include in a partial response when calling + * {@code DnsService#getZone(BigInteger, ZoneFieldOptions...)} or {@code + * DnsService#getZone(String, ZoneFieldOptions...)}. The ID is always returned, even if not + * specified. + */ + enum ZoneField { + CREATION_TIME("creationTime"), + DESCRIPTION("description"), + DNS_NAME("dnsName"), + ZONE_ID("id"), + NAME("name"), + NAME_SERVER_SET("nameServerSet"), + NAME_SERVERS("nameServers"); + + private final String selector; + + ZoneField(String selector) { + this.selector = selector; + } + + public String selector() { + return selector; + } + + static String selector(ZoneField... fields) { + Set fieldStrings = Sets.newHashSetWithExpectedSize(fields.length + 1); + fieldStrings.add(ZONE_ID.selector()); + for (ZoneField field : fields) { + fieldStrings.add(field.selector()); + } + return Joiner.on(',').join(fieldStrings); + } + } + + /** + * The fields of a DNS record. + * + *

These values can be used to specify the fields to include in a partial response when calling + * {@code DnsService#listDnsRecords(BigInteger, DnsRecordOptions...)} or {@code + * DnsService#listDnsRecords(String, DnsRecordOptions...)}. The name is always returned even if + * not selected. + */ + enum DnsRecordField { + DNS_RECORDS("rrdatas"), + NAME("name"), + TTL("ttl"), + TYPE("type"); + + private final String selector; + + DnsRecordField(String selector) { + this.selector = selector; + } + + public String selector() { + return selector; + } + + static String selector(DnsRecordField... fields) { + Set fieldStrings = Sets.newHashSetWithExpectedSize(fields.length + 1); + fieldStrings.add(NAME.selector()); + for (DnsRecordField field : fields) { + fieldStrings.add(field.selector()); + } + return Joiner.on(',').join(fieldStrings); + } + } + + /** + * The fields of a change request. + * + *

These values can be used to specify the fields to include in a partial response when calling + * {@code DnsService#applyChangeRequest(ChangeRequest, BigInteger, ChangeRequestFieldOptions...)} + * or {@code DnsService#applyChangeRequest(ChangeRequest, String, ChangeRequestFieldOptions...)} + * The ID is always returned even if not selected. + */ + enum ChangeRequestField { + ID("id"), + START_TIME("startTime"), + STATUS("status"), + ADDITIONS("additions"), + DELETIONS("deletions"); + + private final String selector; + + ChangeRequestField(String selector) { + this.selector = selector; + } + + public String selector() { + return selector; + } + + static String selector(ChangeRequestField... fields) { + Set fieldStrings = Sets.newHashSetWithExpectedSize(fields.length + 1); + fieldStrings.add(ID.selector()); + for (ChangeRequestField field : fields) { + fieldStrings.add(field.selector()); + } + return Joiner.on(',').join(fieldStrings); + } + } + + /** + * The sorting keys for listing change requests. The only currently supported sorting key is the + * change sequence. + */ + enum ChangeRequestSortingKey { + CHANGE_SEQUENCE("changeSequence"); + + private final String selector; + + ChangeRequestSortingKey(String selector) { + this.selector = selector; + } + + public String selector() { + return selector; + } + } + + /** + * The sorting order for listing change requests. + */ + enum ChangeRequestSortingOrder { + DESCENDING, ASCENDING; + + public String selector() { + return this.name().toLowerCase(); + } + } + + /** + * Class that for specifying DNS record options. + */ + class DnsRecordOptions extends AbstractOption implements Serializable { + + private static final long serialVersionUID = 201601261646L; + + DnsRecordOptions(DnsServiceRpc.Option option, Object value) { + super(option, value); + } + + /** + * Returns an option to specify the DNS record's fields to be returned by the RPC call. + * + *

If this option is not provided all record fields are returned. {@code + * DnsRecordField.fields} can be used to specify only the fields of interest. The name of the + * DNS record always returned, even if not specified. {@link DnsRecordField} provides a list of + * fields that can be used. + */ + public static DnsRecordOptions fields(DnsRecordField... fields) { + StringBuilder builder = new StringBuilder(); + builder.append("rrsets(").append(DnsRecordField.selector(fields)).append(")"); + return new DnsRecordOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); + } + + /** + * Returns an option to specify a page token. + * + *

The page token (returned from a previous call to list) indicates from where listing should + * continue. + */ + public static DnsRecordOptions pageToken(String pageToken) { + return new DnsRecordOptions(DnsServiceRpc.Option.PAGE_TOKEN, pageToken); + } + + /** + * The maximum number of DNS records to return per RPC. + * + *

The server can return fewer records than requested. When there are more results than the + * page size, the server will return a page token that can be used to fetch other results. + */ + public static DnsRecordOptions pageSize(int pageSize) { + return new DnsRecordOptions(DnsServiceRpc.Option.PAGE_SIZE, pageSize); + } + + /** + * Restricts the list to return only zones with this fully qualified domain name. + */ + public static DnsRecordOptions dnsName(String dnsName) { + return new DnsRecordOptions(DnsServiceRpc.Option.DNS_NAME, dnsName); + } + } + + /** + * Class for specifying zone field options. + */ + class ZoneFieldOptions extends AbstractOption implements Serializable { + + private static final long serialVersionUID = -7294186261285469986L; + + ZoneFieldOptions(DnsServiceRpc.Option option, Object value) { + super(option, value); + } + + /** + * Returns an option to specify the zones's fields to be returned by the RPC call. + * + *

If this option is not provided all zone fields are returned. {@code + * ZoneFieldOptions.fields} can be used to specify only the fields of interest. Zone ID is + * always returned, even if not specified. {@link ZoneField} provides a list of fields that can + * be used. + */ + public static ZoneFieldOptions fields(ZoneField... fields) { + return new ZoneFieldOptions(DnsServiceRpc.Option.FIELDS, ZoneField.selector(fields)); + } + } + + /** + * Class for specifying zone listing options. + */ + class ZoneListOptions extends AbstractOption implements Serializable { + + private static final long serialVersionUID = -7922038132321229290L; + + ZoneListOptions(DnsServiceRpc.Option option, Object value) { + super(option, value); + } + + /** + * Returns an option to specify the zones's fields to be returned by the RPC call. + * + *

If this option is not provided all zone fields are returned. {@code + * ZoneFieldOptions.fields} can be used to specify only the fields of interest. Zone ID is + * always returned, even if not specified. {@link ZoneField} provides a list of fields that can + * be used. + */ + public static ZoneListOptions fields(ZoneField... fields) { + return new ZoneListOptions(DnsServiceRpc.Option.FIELDS, ZoneField.selector(fields)); + } + + /** + * Returns an option to specify a page token. + * + *

The page token (returned from a previous call to list) indicates from where listing should + * continue. + */ + public static ZoneListOptions pageToken(String pageToken) { + return new ZoneListOptions(DnsServiceRpc.Option.PAGE_TOKEN, pageToken); + } + + /** + * The maximum number of zones to return per RPC. + * + *

The server can return fewer zones than requested. When there are more results than the + * page size, the server will return a page token that can be used to fetch other results. + */ + public static ZoneListOptions pageSize(int pageSize) { + return new ZoneListOptions(DnsServiceRpc.Option.PAGE_SIZE, pageSize); + } + + /** + * Restricts the list to return only zones with this fully qualified domain name. + */ + public static ZoneListOptions dnsName(String dnsName) { + return new ZoneListOptions(DnsServiceRpc.Option.DNS_NAME, dnsName); + } + } + + /** + * Class for specifying project options. + */ + class ProjectOptions extends AbstractOption implements Serializable { + + private static final long serialVersionUID = 6817937338218847748L; + + ProjectOptions(DnsServiceRpc.Option option, Object value) { + super(option, value); + } + + /** + * Returns an option to specify the project's fields to be returned by the RPC call. + * + *

If this option is not provided all project fields are returned. {@code + * ProjectOptions.fields} can be used to specify only the fields of interest. Project ID is + * always returned, even if not specified. {@link ProjectField} provides a list of fields that + * can be used. + */ + public static ProjectOptions fields(ProjectField... fields) { + return new ProjectOptions(DnsServiceRpc.Option.FIELDS, ProjectField.selector(fields)); + } + } + + /** + * Class for specifying change request field options. + */ + class ChangeRequestFieldOptions extends AbstractOption implements Serializable { + + private static final long serialVersionUID = 1067273695061077782L; + + ChangeRequestFieldOptions(DnsServiceRpc.Option option, Object value) { + super(option, value); + } + + /** + * Returns an option to specify which fields of DNS records to be added by the {@link + * ChangeRequest} should be returned by the service. + * + *

If this option is not provided, all record fields are returned. {@code + * ChangeRequestFieldOptions.additionsFields} can be used to specify only the fields of + * interest. The name of the DNS record always returned, even if not specified. {@link + * DnsRecordField} provides a list of fields that can be used. + */ + public static ChangeRequestFieldOptions additionsFields(DnsRecordField... fields) { + StringBuilder builder = new StringBuilder(); + builder.append("additions(").append(DnsRecordField.selector(fields)).append(")"); + return new ChangeRequestFieldOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); + } + + /** + * Returns an option to specify which fields of DNS records to be deleted by the {@link + * ChangeRequest} should be returned by the service. + * + *

If this option is not provided, all record fields are returned. {@code + * ChangeRequestFieldOptions.deletionsFields} can be used to specify only the fields of + * interest. The name of the DNS record always returned, even if not specified. {@link + * DnsRecordField} provides a list of fields that can be used. + */ + public static ChangeRequestFieldOptions deletionsFields(DnsRecordField... fields) { + StringBuilder builder = new StringBuilder(); + builder.append("deletions(").append(DnsRecordField.selector(fields)).append(")"); + return new ChangeRequestFieldOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); + + } + + /** + * Returns an option to specify which fields of {@link ChangeRequest} should be returned by the + * service. + * + *

If this option is not provided all change request fields are returned. {@code + * ChangeRequestFieldOptions.fields} can be used to specify only the fields of interest. The ID + * of the change request is always returned, even if not specified. {@link ChangeRequestField} + * provides a list of fields that can be used. + */ + public static ChangeRequestFieldOptions fields(ChangeRequestField... fields) { + return new ChangeRequestFieldOptions( + DnsServiceRpc.Option.FIELDS, + ChangeRequestField.selector(fields) + ); + } + } + + /** + * Class for specifying change request listing options. + */ + class ChangeRequestListOptions extends AbstractOption implements Serializable { + + private static final long serialVersionUID = -900209143895376089L; + + ChangeRequestListOptions(DnsServiceRpc.Option option, Object value) { + super(option, value); + } + + /** + * Returns an option to specify which fields of DNS records to be added by the {@link + * ChangeRequest} should be returned by the service. + * + *

If this option is not provided, all record fields are returned. {@code + * ChangeRequestFieldOptions.additionsFields} can be used to specify only the fields of + * interest. The name of the DNS record always returned, even if not specified. {@link + * DnsRecordField} provides a list of fields that can be used. + */ + public static ChangeRequestListOptions additionsFields(DnsRecordField... fields) { + StringBuilder builder = new StringBuilder(); + builder.append("changes(additions(").append(DnsRecordField.selector(fields)).append("))"); + return new ChangeRequestListOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); + } + + /** + * Returns an option to specify which fields of DNS records to be deleted by the {@link + * ChangeRequest} should be returned by the service. + * + *

If this option is not provided, all record fields are returned. {@code + * ChangeRequestFieldOptions.deletionsFields} can be used to specify only the fields of + * interest. The name of the DNS record always returned, even if not specified. {@link + * DnsRecordField} provides a list of fields that can be used. + */ + public static ChangeRequestListOptions deletionsFields(DnsRecordField... fields) { + StringBuilder builder = new StringBuilder(); + builder.append("changes(deletions(").append(DnsRecordField.selector(fields)).append("))"); + return new ChangeRequestListOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); + } + + /** + * Returns an option to specify which fields of{@link ChangeRequest} should be returned by the + * service. + * + *

If this option is not provided all change request fields are returned. {@code + * ChangeRequestFieldOptions.fields} can be used to specify only the fields of interest. The ID + * of the change request is always returned, even if not specified. {@link ChangeRequestField} + * provides a list of fields that can be used. + */ + public static ChangeRequestListOptions fields(ChangeRequestField... fields) { + return new ChangeRequestListOptions( + DnsServiceRpc.Option.FIELDS, + ChangeRequestField.selector(fields) + ); + } + + /** + * Returns an option to specify a page token. + * + *

The page token (returned from a previous call to list) indicates from where listing should + * continue. + */ + public static ChangeRequestListOptions pageToken(String pageToken) { + return new ChangeRequestListOptions(DnsServiceRpc.Option.PAGE_TOKEN, pageToken); + } + + /** + * The maximum number of change requests to return per RPC. + * + *

The server can return fewer change requests than requested. When there are more results + * than the page size, the server will return a page token that can be used to fetch other + * results. + */ + public static ChangeRequestListOptions pageSize(int pageSize) { + return new ChangeRequestListOptions(DnsServiceRpc.Option.PAGE_SIZE, pageSize); + } + + /** + * Returns an option for specifying the sorting criterion of change requests. Note the the only + * currently supported criterion is the change sequence. + */ + public static ChangeRequestListOptions sortBy(ChangeRequestSortingKey key) { + return new ChangeRequestListOptions(DnsServiceRpc.Option.SORTING_KEY, key.selector()); + } + + /** + * Returns an option to specify whether the the change requests should be listed in ascending or + * descending order. + */ + public static ChangeRequestListOptions sortOrder(ChangeRequestSortingOrder order) { + return new ChangeRequestListOptions(DnsServiceRpc.Option.SORTING_ORDER, order.selector()); + } + } + + // TODO(mderka) Add methods. Created issue #596. +} From 4fdc8ee53b189a137aa990dca366db369e47cf9c Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 28 Jan 2016 15:57:12 -0800 Subject: [PATCH 23/50] Added AbstractOption. --- .../com/google/gcloud/dns/AbstractOption.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/AbstractOption.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/AbstractOption.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/AbstractOption.java new file mode 100644 index 000000000000..6b6fbbf0606e --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/AbstractOption.java @@ -0,0 +1,69 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.MoreObjects; +import com.google.gcloud.spi.DnsServiceRpc; + +import java.io.Serializable; +import java.util.Objects; + +/** + * A base class for options. + */ +public abstract class AbstractOption implements Serializable { + + private static final long serialVersionUID = 201601261704L; + private final Object value; + private final DnsServiceRpc.Option rpcOption; + + AbstractOption(DnsServiceRpc.Option rpcOption, Object value) { + this.rpcOption = checkNotNull(rpcOption); + this.value = value; + } + + Object value() { + return value; + } + + DnsServiceRpc.Option rpcOption() { + return rpcOption; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof AbstractOption)) { + return false; + } + AbstractOption other = (AbstractOption) obj; + return Objects.equals(value, other.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("value", value) + .toString(); + } +} From 06becd885dc0d4c45cd779a06be448b5179e77d1 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 28 Jan 2016 15:58:13 -0800 Subject: [PATCH 24/50] Added DnsException. --- .../com/google/gcloud/dns/DnsException.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java new file mode 100644 index 000000000000..ab4a3df0f457 --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java @@ -0,0 +1,37 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import com.google.gcloud.BaseServiceException; + +/** + * DNS service exception. + */ +public class DnsException extends BaseServiceException { + + private static final long serialVersionUID = 490302380416260252L; + + public DnsException(int code, String message, boolean retryable) { + super(code, message, retryable); + } + + public DnsException(int code, String message, boolean retryable, Exception cause) { + super(code, message, retryable, cause); + } + + //TODO(mderka) Add translation and retry functionality. Created issue #593. +} From 81cedc4edf78e745817c831c1d7cde7653dfc4f8 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 28 Jan 2016 16:00:19 -0800 Subject: [PATCH 25/50] Added DnsServiceRpc. --- .../com/google/gcloud/spi/DnsServiceRpc.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpc.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpc.java new file mode 100644 index 000000000000..e97ee9a1b001 --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpc.java @@ -0,0 +1,56 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.spi; + +import java.util.Map; + +public interface DnsServiceRpc { + + enum Option { + FIELDS("fields"), + PAGE_SIZE("maxSize"), + PAGE_TOKEN("pageToken"), + DNS_NAME("dnsName"), + SORTING_KEY("sortBy"), + SORTING_ORDER("sortOrder"); + + private final String value; + + Option(String value) { + this.value = value; + } + + public String value() { + return value; + } + + @SuppressWarnings("unchecked") + T get(Map options) { + return (T) options.get(this); + } + + String getString(Map options) { + return get(options); + } + + Integer getInt(Map options) { + return get(options); + } + } + + //TODO(mderka) add supported operations. Created issue #594. +} From bf1361c034633137ba395f6e565a1579fb4797fb Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 28 Jan 2016 16:38:21 -0800 Subject: [PATCH 26/50] Added DnsServiceOptions and necessary dependencies. --- .../com/google/gcloud/dns/DnsService.java | 1 + .../google/gcloud/dns/DnsServiceFactory.java | 25 ++++++ .../google/gcloud/dns/DnsServiceOptions.java | 85 +++++++++++++++++++ .../gcloud/spi/DnsServiceRpcFactory.java | 26 ++++++ 4 files changed, 137 insertions(+) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceFactory.java create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceOptions.java create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpcFactory.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java index 694b0b288154..9cbd60eccf5a 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java @@ -18,6 +18,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.Sets; +import com.google.gcloud.Service; import com.google.gcloud.spi.DnsServiceRpc; import java.io.Serializable; diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceFactory.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceFactory.java new file mode 100644 index 000000000000..aaa0dfb68e1b --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceFactory.java @@ -0,0 +1,25 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import com.google.gcloud.ServiceFactory; + +/** + * An interface for DnsService factories. + */ +public interface DnsServiceFactory extends ServiceFactory { +} diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceOptions.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceOptions.java new file mode 100644 index 000000000000..84eb9c33dcaa --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceOptions.java @@ -0,0 +1,85 @@ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import com.google.gcloud.ServiceOptions; +import com.google.gcloud.spi.DnsServiceRpc; +import com.google.gcloud.spi.DnsServiceRpcFactory; + +import java.util.Set; + +public class DnsServiceOptions + extends ServiceOptions { + + private static final long serialVersionUID = -5311219368450107146L; + + // TODO(mderka) Finish implementation. Created issue #595. + + public static class DefaultDnsServiceFactory implements DnsServiceFactory { + private static final DnsServiceFactory INSTANCE = new DefaultDnsServiceFactory(); + + @Override + public DnsService create(DnsServiceOptions options) { + // TODO(mderka) Implement. Created issue #595. + return null; + } + } + + public static class Builder extends ServiceOptions.Builder { + + private Builder() { + } + + private Builder(DnsServiceOptions options) { + super(options); + } + + @Override + public DnsServiceOptions build() { + return new DnsServiceOptions(this); + } + } + + private DnsServiceOptions(Builder builder) { + super(DnsServiceFactory.class, DnsServiceRpcFactory.class, builder); + } + + @Override + protected DnsServiceFactory defaultServiceFactory() { + return DefaultDnsServiceFactory.INSTANCE; + } + + @Override + protected DnsServiceRpcFactory defaultRpcFactory() { + return null; + } + + @Override + protected Set scopes() { + return null; + } + + @Override + public Builder toBuilder() { + return new Builder(this); + } + + public static Builder builder() { + return new Builder(); + } +} diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpcFactory.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpcFactory.java new file mode 100644 index 000000000000..13ec9fe881c8 --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpcFactory.java @@ -0,0 +1,26 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.spi; + +import com.google.gcloud.dns.DnsServiceOptions; + +/** + * An interface for DnsServiceRpc factory. Implementation will be loaded via {@link + * java.util.ServiceLoader}. + */ +public interface DnsServiceRpcFactory extends ServiceRpcFactory { +} From 465f5327d81035666a12c1ef37bab0a1bfd55300 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 28 Jan 2016 18:15:47 -0800 Subject: [PATCH 27/50] Modified DnsException to pass tests. --- .../main/java/com/google/gcloud/dns/DnsException.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java index ab4a3df0f457..d18f6163a881 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java @@ -18,6 +18,8 @@ import com.google.gcloud.BaseServiceException; +import java.io.IOException; + /** * DNS service exception. */ @@ -25,12 +27,8 @@ public class DnsException extends BaseServiceException { private static final long serialVersionUID = 490302380416260252L; - public DnsException(int code, String message, boolean retryable) { - super(code, message, retryable); - } - - public DnsException(int code, String message, boolean retryable, Exception cause) { - super(code, message, retryable, cause); + public DnsException(IOException exception, boolean idempotent) { + super(exception, idempotent); } //TODO(mderka) Add translation and retry functionality. Created issue #593. From a8bee9c1e07337d1e710d378d7a600215e26c1ba Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Fri, 29 Jan 2016 16:10:25 -0800 Subject: [PATCH 28/50] Implements comments by @aozarov. --- .../com/google/gcloud/dns/AbstractOption.java | 17 +- .../gcloud/dns/{DnsService.java => Dns.java} | 229 +++++++----------- ...DnsServiceFactory.java => DnsFactory.java} | 4 +- ...DnsServiceOptions.java => DnsOptions.java} | 38 +-- .../spi/{DnsServiceRpc.java => DnsRpc.java} | 3 +- ...viceRpcFactory.java => DnsRpcFactory.java} | 6 +- 6 files changed, 120 insertions(+), 177 deletions(-) rename gcloud-java-dns/src/main/java/com/google/gcloud/dns/{DnsService.java => Dns.java} (51%) rename gcloud-java-dns/src/main/java/com/google/gcloud/dns/{DnsServiceFactory.java => DnsFactory.java} (84%) rename gcloud-java-dns/src/main/java/com/google/gcloud/dns/{DnsServiceOptions.java => DnsOptions.java} (59%) rename gcloud-java-dns/src/main/java/com/google/gcloud/spi/{DnsServiceRpc.java => DnsRpc.java} (96%) rename gcloud-java-dns/src/main/java/com/google/gcloud/spi/{DnsServiceRpcFactory.java => DnsRpcFactory.java} (74%) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/AbstractOption.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/AbstractOption.java index 6b6fbbf0606e..a148468d14b5 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/AbstractOption.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/AbstractOption.java @@ -19,7 +19,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.MoreObjects; -import com.google.gcloud.spi.DnsServiceRpc; +import com.google.gcloud.spi.DnsRpc; import java.io.Serializable; import java.util.Objects; @@ -27,13 +27,13 @@ /** * A base class for options. */ -public abstract class AbstractOption implements Serializable { +abstract class AbstractOption implements Serializable { - private static final long serialVersionUID = 201601261704L; + private static final long serialVersionUID = -5912727967831484228L; private final Object value; - private final DnsServiceRpc.Option rpcOption; + private final DnsRpc.Option rpcOption; - AbstractOption(DnsServiceRpc.Option rpcOption, Object value) { + AbstractOption(DnsRpc.Option rpcOption, Object value) { this.rpcOption = checkNotNull(rpcOption); this.value = value; } @@ -42,7 +42,7 @@ Object value() { return value; } - DnsServiceRpc.Option rpcOption() { + DnsRpc.Option rpcOption() { return rpcOption; } @@ -52,18 +52,19 @@ public boolean equals(Object obj) { return false; } AbstractOption other = (AbstractOption) obj; - return Objects.equals(value, other.value); + return Objects.equals(value, other.value) && Objects.equals(rpcOption, other.rpcOption); } @Override public int hashCode() { - return Objects.hash(value); + return Objects.hash(value, rpcOption); } @Override public String toString() { return MoreObjects.toStringHelper(this) .add("value", value) + .add("rpcOption", rpcOption) .toString(); } } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java similarity index 51% rename from gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java rename to gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 9cbd60eccf5a..737ec1a38699 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsService.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -19,7 +19,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.Sets; import com.google.gcloud.Service; -import com.google.gcloud.spi.DnsServiceRpc; +import com.google.gcloud.spi.DnsRpc; import java.io.Serializable; import java.util.Set; @@ -29,13 +29,13 @@ * * @see Google Cloud DNS */ -public interface DnsService extends Service { +public interface Dns extends Service { /** * The fields of a project. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code DnsService#getProjectInfo(ProjectOptions...)}. Project ID is always returned, even if + * {@code Dns#getProjectInfo(ProjectGetOption...)}. Project ID is always returned, even if * not specified. */ enum ProjectField { @@ -49,7 +49,7 @@ enum ProjectField { this.selector = selector; } - public String selector() { + String selector() { return selector; } @@ -67,9 +67,8 @@ static String selector(ProjectField... fields) { * The fields of a zone. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code DnsService#getZone(BigInteger, ZoneFieldOptions...)} or {@code - * DnsService#getZone(String, ZoneFieldOptions...)}. The ID is always returned, even if not - * specified. + * {@code Dns#getZone(BigInteger, ZoneFieldOption...)} or {@code Dns#getZone(String, + * ZoneFieldOption...)}. The ID is always returned, even if not specified. */ enum ZoneField { CREATION_TIME("creationTime"), @@ -86,7 +85,7 @@ enum ZoneField { this.selector = selector; } - public String selector() { + String selector() { return selector; } @@ -104,8 +103,8 @@ static String selector(ZoneField... fields) { * The fields of a DNS record. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code DnsService#listDnsRecords(BigInteger, DnsRecordOptions...)} or {@code - * DnsService#listDnsRecords(String, DnsRecordOptions...)}. The name is always returned even if + * {@code Dns#listDnsRecords(BigInteger, DnsRecordListOption...)} or {@code + * Dns#listDnsRecords(String, DnsRecordListOption...)}. The name is always returned even if * not selected. */ enum DnsRecordField { @@ -120,7 +119,7 @@ enum DnsRecordField { this.selector = selector; } - public String selector() { + String selector() { return selector; } @@ -138,8 +137,8 @@ static String selector(DnsRecordField... fields) { * The fields of a change request. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code DnsService#applyChangeRequest(ChangeRequest, BigInteger, ChangeRequestFieldOptions...)} - * or {@code DnsService#applyChangeRequest(ChangeRequest, String, ChangeRequestFieldOptions...)} + * {@code Dns#applyChangeRequest(ChangeRequest, BigInteger, ChangeRequestOption...)} + * or {@code Dns#applyChangeRequest(ChangeRequest, String, ChangeRequestOption...)} * The ID is always returned even if not selected. */ enum ChangeRequestField { @@ -155,7 +154,7 @@ enum ChangeRequestField { this.selector = selector; } - public String selector() { + String selector() { return selector; } @@ -171,10 +170,10 @@ static String selector(ChangeRequestField... fields) { /** * The sorting keys for listing change requests. The only currently supported sorting key is the - * change sequence. + * when the change request was created. */ enum ChangeRequestSortingKey { - CHANGE_SEQUENCE("changeSequence"); + TIME_CREATED("changeSequence"); private final String selector; @@ -182,15 +181,15 @@ enum ChangeRequestSortingKey { this.selector = selector; } - public String selector() { + String selector() { return selector; } } /** - * The sorting order for listing change requests. + * The sorting order for listing. */ - enum ChangeRequestSortingOrder { + enum SortingOrder { DESCENDING, ASCENDING; public String selector() { @@ -201,11 +200,11 @@ public String selector() { /** * Class that for specifying DNS record options. */ - class DnsRecordOptions extends AbstractOption implements Serializable { + class DnsRecordListOption extends AbstractOption implements Serializable { - private static final long serialVersionUID = 201601261646L; + private static final long serialVersionUID = 1009627025381096098L; - DnsRecordOptions(DnsServiceRpc.Option option, Object value) { + DnsRecordListOption(DnsRpc.Option option, Object value) { super(option, value); } @@ -217,10 +216,10 @@ class DnsRecordOptions extends AbstractOption implements Serializable { * DNS record always returned, even if not specified. {@link DnsRecordField} provides a list of * fields that can be used. */ - public static DnsRecordOptions fields(DnsRecordField... fields) { + public static DnsRecordListOption fields(DnsRecordField... fields) { StringBuilder builder = new StringBuilder(); - builder.append("rrsets(").append(DnsRecordField.selector(fields)).append(")"); - return new DnsRecordOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); + builder.append("rrsets(").append(DnsRecordField.selector(fields)).append(')'); + return new DnsRecordListOption(DnsRpc.Option.FIELDS, builder.toString()); } /** @@ -229,8 +228,8 @@ public static DnsRecordOptions fields(DnsRecordField... fields) { *

The page token (returned from a previous call to list) indicates from where listing should * continue. */ - public static DnsRecordOptions pageToken(String pageToken) { - return new DnsRecordOptions(DnsServiceRpc.Option.PAGE_TOKEN, pageToken); + public static DnsRecordListOption pageToken(String pageToken) { + return new DnsRecordListOption(DnsRpc.Option.PAGE_TOKEN, pageToken); } /** @@ -239,26 +238,34 @@ public static DnsRecordOptions pageToken(String pageToken) { *

The server can return fewer records than requested. When there are more results than the * page size, the server will return a page token that can be used to fetch other results. */ - public static DnsRecordOptions pageSize(int pageSize) { - return new DnsRecordOptions(DnsServiceRpc.Option.PAGE_SIZE, pageSize); + public static DnsRecordListOption pageSize(int pageSize) { + return new DnsRecordListOption(DnsRpc.Option.PAGE_SIZE, pageSize); } /** - * Restricts the list to return only zones with this fully qualified domain name. + * Restricts the list to only DNS records with this fully qualified domain name. */ - public static DnsRecordOptions dnsName(String dnsName) { - return new DnsRecordOptions(DnsServiceRpc.Option.DNS_NAME, dnsName); + public static DnsRecordListOption dnsName(String dnsName) { + return new DnsRecordListOption(DnsRpc.Option.DNS_NAME, dnsName); + } + + /** + * Restricts the list to return only records of this type. If present, {@link + * Dns.DnsRecordListOption#dnsName(String)} must also be present. + */ + public static DnsRecordListOption type(DnsRecord.Type type) { + return new DnsRecordListOption(DnsRpc.Option.DNS_TYPE, type); } } /** * Class for specifying zone field options. */ - class ZoneFieldOptions extends AbstractOption implements Serializable { + class ZoneFieldOption extends AbstractOption implements Serializable { - private static final long serialVersionUID = -7294186261285469986L; + private static final long serialVersionUID = -8065564464895945037L; - ZoneFieldOptions(DnsServiceRpc.Option option, Object value) { + ZoneFieldOption(DnsRpc.Option option, Object value) { super(option, value); } @@ -266,23 +273,23 @@ class ZoneFieldOptions extends AbstractOption implements Serializable { * Returns an option to specify the zones's fields to be returned by the RPC call. * *

If this option is not provided all zone fields are returned. {@code - * ZoneFieldOptions.fields} can be used to specify only the fields of interest. Zone ID is - * always returned, even if not specified. {@link ZoneField} provides a list of fields that can - * be used. + * ZoneFieldOption.fields} can be used to specify only the fields of interest. Zone ID is always + * returned, even if not specified. {@link ZoneField} provides a list of fields that can be + * used. */ - public static ZoneFieldOptions fields(ZoneField... fields) { - return new ZoneFieldOptions(DnsServiceRpc.Option.FIELDS, ZoneField.selector(fields)); + public static ZoneFieldOption fields(ZoneField... fields) { + return new ZoneFieldOption(DnsRpc.Option.FIELDS, ZoneField.selector(fields)); } } /** * Class for specifying zone listing options. */ - class ZoneListOptions extends AbstractOption implements Serializable { + class ZoneListOption extends AbstractOption implements Serializable { - private static final long serialVersionUID = -7922038132321229290L; + private static final long serialVersionUID = -2830645032124504717L; - ZoneListOptions(DnsServiceRpc.Option option, Object value) { + ZoneListOption(DnsRpc.Option option, Object value) { super(option, value); } @@ -290,12 +297,12 @@ class ZoneListOptions extends AbstractOption implements Serializable { * Returns an option to specify the zones's fields to be returned by the RPC call. * *

If this option is not provided all zone fields are returned. {@code - * ZoneFieldOptions.fields} can be used to specify only the fields of interest. Zone ID is - * always returned, even if not specified. {@link ZoneField} provides a list of fields that can - * be used. + * ZoneFieldOption.fields} can be used to specify only the fields of interest. Zone ID is always + * returned, even if not specified. {@link ZoneField} provides a list of fields that can be + * used. */ - public static ZoneListOptions fields(ZoneField... fields) { - return new ZoneListOptions(DnsServiceRpc.Option.FIELDS, ZoneField.selector(fields)); + public static ZoneListOption fields(ZoneField... fields) { + return new ZoneListOption(DnsRpc.Option.FIELDS, ZoneField.selector(fields)); } /** @@ -304,8 +311,8 @@ public static ZoneListOptions fields(ZoneField... fields) { *

The page token (returned from a previous call to list) indicates from where listing should * continue. */ - public static ZoneListOptions pageToken(String pageToken) { - return new ZoneListOptions(DnsServiceRpc.Option.PAGE_TOKEN, pageToken); + public static ZoneListOption pageToken(String pageToken) { + return new ZoneListOption(DnsRpc.Option.PAGE_TOKEN, pageToken); } /** @@ -314,26 +321,19 @@ public static ZoneListOptions pageToken(String pageToken) { *

The server can return fewer zones than requested. When there are more results than the * page size, the server will return a page token that can be used to fetch other results. */ - public static ZoneListOptions pageSize(int pageSize) { - return new ZoneListOptions(DnsServiceRpc.Option.PAGE_SIZE, pageSize); - } - - /** - * Restricts the list to return only zones with this fully qualified domain name. - */ - public static ZoneListOptions dnsName(String dnsName) { - return new ZoneListOptions(DnsServiceRpc.Option.DNS_NAME, dnsName); + public static ZoneListOption pageSize(int pageSize) { + return new ZoneListOption(DnsRpc.Option.PAGE_SIZE, pageSize); } } /** * Class for specifying project options. */ - class ProjectOptions extends AbstractOption implements Serializable { + class ProjectGetOption extends AbstractOption implements Serializable { private static final long serialVersionUID = 6817937338218847748L; - ProjectOptions(DnsServiceRpc.Option option, Object value) { + ProjectGetOption(DnsRpc.Option option, Object value) { super(option, value); } @@ -341,69 +341,38 @@ class ProjectOptions extends AbstractOption implements Serializable { * Returns an option to specify the project's fields to be returned by the RPC call. * *

If this option is not provided all project fields are returned. {@code - * ProjectOptions.fields} can be used to specify only the fields of interest. Project ID is + * ProjectGetOption.fields} can be used to specify only the fields of interest. Project ID is * always returned, even if not specified. {@link ProjectField} provides a list of fields that * can be used. */ - public static ProjectOptions fields(ProjectField... fields) { - return new ProjectOptions(DnsServiceRpc.Option.FIELDS, ProjectField.selector(fields)); + public static ProjectGetOption fields(ProjectField... fields) { + return new ProjectGetOption(DnsRpc.Option.FIELDS, ProjectField.selector(fields)); } } /** * Class for specifying change request field options. */ - class ChangeRequestFieldOptions extends AbstractOption implements Serializable { + class ChangeRequestOption extends AbstractOption implements Serializable { private static final long serialVersionUID = 1067273695061077782L; - ChangeRequestFieldOptions(DnsServiceRpc.Option option, Object value) { + ChangeRequestOption(DnsRpc.Option option, Object value) { super(option, value); } - /** - * Returns an option to specify which fields of DNS records to be added by the {@link - * ChangeRequest} should be returned by the service. - * - *

If this option is not provided, all record fields are returned. {@code - * ChangeRequestFieldOptions.additionsFields} can be used to specify only the fields of - * interest. The name of the DNS record always returned, even if not specified. {@link - * DnsRecordField} provides a list of fields that can be used. - */ - public static ChangeRequestFieldOptions additionsFields(DnsRecordField... fields) { - StringBuilder builder = new StringBuilder(); - builder.append("additions(").append(DnsRecordField.selector(fields)).append(")"); - return new ChangeRequestFieldOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); - } - - /** - * Returns an option to specify which fields of DNS records to be deleted by the {@link - * ChangeRequest} should be returned by the service. - * - *

If this option is not provided, all record fields are returned. {@code - * ChangeRequestFieldOptions.deletionsFields} can be used to specify only the fields of - * interest. The name of the DNS record always returned, even if not specified. {@link - * DnsRecordField} provides a list of fields that can be used. - */ - public static ChangeRequestFieldOptions deletionsFields(DnsRecordField... fields) { - StringBuilder builder = new StringBuilder(); - builder.append("deletions(").append(DnsRecordField.selector(fields)).append(")"); - return new ChangeRequestFieldOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); - - } - /** * Returns an option to specify which fields of {@link ChangeRequest} should be returned by the * service. * *

If this option is not provided all change request fields are returned. {@code - * ChangeRequestFieldOptions.fields} can be used to specify only the fields of interest. The ID + * ChangeRequestOption.fields} can be used to specify only the fields of interest. The ID * of the change request is always returned, even if not specified. {@link ChangeRequestField} * provides a list of fields that can be used. */ - public static ChangeRequestFieldOptions fields(ChangeRequestField... fields) { - return new ChangeRequestFieldOptions( - DnsServiceRpc.Option.FIELDS, + public static ChangeRequestOption fields(ChangeRequestField... fields) { + return new ChangeRequestOption( + DnsRpc.Option.FIELDS, ChangeRequestField.selector(fields) ); } @@ -412,56 +381,26 @@ public static ChangeRequestFieldOptions fields(ChangeRequestField... fields) { /** * Class for specifying change request listing options. */ - class ChangeRequestListOptions extends AbstractOption implements Serializable { + class ChangeRequestListOption extends AbstractOption implements Serializable { private static final long serialVersionUID = -900209143895376089L; - ChangeRequestListOptions(DnsServiceRpc.Option option, Object value) { + ChangeRequestListOption(DnsRpc.Option option, Object value) { super(option, value); } - /** - * Returns an option to specify which fields of DNS records to be added by the {@link - * ChangeRequest} should be returned by the service. - * - *

If this option is not provided, all record fields are returned. {@code - * ChangeRequestFieldOptions.additionsFields} can be used to specify only the fields of - * interest. The name of the DNS record always returned, even if not specified. {@link - * DnsRecordField} provides a list of fields that can be used. - */ - public static ChangeRequestListOptions additionsFields(DnsRecordField... fields) { - StringBuilder builder = new StringBuilder(); - builder.append("changes(additions(").append(DnsRecordField.selector(fields)).append("))"); - return new ChangeRequestListOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); - } - - /** - * Returns an option to specify which fields of DNS records to be deleted by the {@link - * ChangeRequest} should be returned by the service. - * - *

If this option is not provided, all record fields are returned. {@code - * ChangeRequestFieldOptions.deletionsFields} can be used to specify only the fields of - * interest. The name of the DNS record always returned, even if not specified. {@link - * DnsRecordField} provides a list of fields that can be used. - */ - public static ChangeRequestListOptions deletionsFields(DnsRecordField... fields) { - StringBuilder builder = new StringBuilder(); - builder.append("changes(deletions(").append(DnsRecordField.selector(fields)).append("))"); - return new ChangeRequestListOptions(DnsServiceRpc.Option.FIELDS, builder.toString()); - } - /** * Returns an option to specify which fields of{@link ChangeRequest} should be returned by the * service. * *

If this option is not provided all change request fields are returned. {@code - * ChangeRequestFieldOptions.fields} can be used to specify only the fields of interest. The ID + * ChangeRequestOption.fields} can be used to specify only the fields of interest. The ID * of the change request is always returned, even if not specified. {@link ChangeRequestField} * provides a list of fields that can be used. */ - public static ChangeRequestListOptions fields(ChangeRequestField... fields) { - return new ChangeRequestListOptions( - DnsServiceRpc.Option.FIELDS, + public static ChangeRequestListOption fields(ChangeRequestField... fields) { + return new ChangeRequestListOption( + DnsRpc.Option.FIELDS, ChangeRequestField.selector(fields) ); } @@ -472,8 +411,8 @@ public static ChangeRequestListOptions fields(ChangeRequestField... fields) { *

The page token (returned from a previous call to list) indicates from where listing should * continue. */ - public static ChangeRequestListOptions pageToken(String pageToken) { - return new ChangeRequestListOptions(DnsServiceRpc.Option.PAGE_TOKEN, pageToken); + public static ChangeRequestListOption pageToken(String pageToken) { + return new ChangeRequestListOption(DnsRpc.Option.PAGE_TOKEN, pageToken); } /** @@ -483,24 +422,24 @@ public static ChangeRequestListOptions pageToken(String pageToken) { * than the page size, the server will return a page token that can be used to fetch other * results. */ - public static ChangeRequestListOptions pageSize(int pageSize) { - return new ChangeRequestListOptions(DnsServiceRpc.Option.PAGE_SIZE, pageSize); + public static ChangeRequestListOption pageSize(int pageSize) { + return new ChangeRequestListOption(DnsRpc.Option.PAGE_SIZE, pageSize); } /** * Returns an option for specifying the sorting criterion of change requests. Note the the only * currently supported criterion is the change sequence. */ - public static ChangeRequestListOptions sortBy(ChangeRequestSortingKey key) { - return new ChangeRequestListOptions(DnsServiceRpc.Option.SORTING_KEY, key.selector()); + public static ChangeRequestListOption sortBy(ChangeRequestSortingKey key) { + return new ChangeRequestListOption(DnsRpc.Option.SORTING_KEY, key.selector()); } /** * Returns an option to specify whether the the change requests should be listed in ascending or * descending order. */ - public static ChangeRequestListOptions sortOrder(ChangeRequestSortingOrder order) { - return new ChangeRequestListOptions(DnsServiceRpc.Option.SORTING_ORDER, order.selector()); + public static ChangeRequestListOption sortOrder(SortingOrder order) { + return new ChangeRequestListOption(DnsRpc.Option.SORTING_ORDER, order.selector()); } } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceFactory.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsFactory.java similarity index 84% rename from gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceFactory.java rename to gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsFactory.java index aaa0dfb68e1b..734652afb24d 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceFactory.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsFactory.java @@ -19,7 +19,7 @@ import com.google.gcloud.ServiceFactory; /** - * An interface for DnsService factories. + * An interface for Dns factories. */ -public interface DnsServiceFactory extends ServiceFactory { +public interface DnsFactory extends ServiceFactory { } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceOptions.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java similarity index 59% rename from gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceOptions.java rename to gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java index 84eb9c33dcaa..3663211d3b41 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsServiceOptions.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java @@ -16,62 +16,64 @@ package com.google.gcloud.dns; +import com.google.common.collect.Sets; import com.google.gcloud.ServiceOptions; -import com.google.gcloud.spi.DnsServiceRpc; -import com.google.gcloud.spi.DnsServiceRpcFactory; +import com.google.gcloud.spi.DnsRpc; +import com.google.gcloud.spi.DnsRpcFactory; import java.util.Set; -public class DnsServiceOptions - extends ServiceOptions { +public class DnsOptions + extends ServiceOptions { private static final long serialVersionUID = -5311219368450107146L; // TODO(mderka) Finish implementation. Created issue #595. - public static class DefaultDnsServiceFactory implements DnsServiceFactory { - private static final DnsServiceFactory INSTANCE = new DefaultDnsServiceFactory(); + public static class DefaultDnsFactory implements DnsFactory { + private static final DnsFactory INSTANCE = new DefaultDnsFactory(); @Override - public DnsService create(DnsServiceOptions options) { + public Dns create(DnsOptions options) { // TODO(mderka) Implement. Created issue #595. return null; } } - public static class Builder extends ServiceOptions.Builder { + public static class Builder extends ServiceOptions.Builder { private Builder() { } - private Builder(DnsServiceOptions options) { + private Builder(DnsOptions options) { super(options); } @Override - public DnsServiceOptions build() { - return new DnsServiceOptions(this); + public DnsOptions build() { + return new DnsOptions(this); } } - private DnsServiceOptions(Builder builder) { - super(DnsServiceFactory.class, DnsServiceRpcFactory.class, builder); + private DnsOptions(Builder builder) { + super(DnsFactory.class, DnsRpcFactory.class, builder); } @Override - protected DnsServiceFactory defaultServiceFactory() { - return DefaultDnsServiceFactory.INSTANCE; + protected DnsFactory defaultServiceFactory() { + return DefaultDnsFactory.INSTANCE; } @Override - protected DnsServiceRpcFactory defaultRpcFactory() { + protected DnsRpcFactory defaultRpcFactory() { return null; } @Override protected Set scopes() { - return null; + // TODO(mderka) Verify. + return Sets.newHashSet("ndev.clouddns.readwrite"); } @Override diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java similarity index 96% rename from gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpc.java rename to gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java index e97ee9a1b001..02afb7309c6a 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java @@ -18,13 +18,14 @@ import java.util.Map; -public interface DnsServiceRpc { +public interface DnsRpc { enum Option { FIELDS("fields"), PAGE_SIZE("maxSize"), PAGE_TOKEN("pageToken"), DNS_NAME("dnsName"), + DNS_TYPE("type"), SORTING_KEY("sortBy"), SORTING_ORDER("sortOrder"); diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpcFactory.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpcFactory.java similarity index 74% rename from gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpcFactory.java rename to gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpcFactory.java index 13ec9fe881c8..3d25f09bb1e5 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsServiceRpcFactory.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpcFactory.java @@ -16,11 +16,11 @@ package com.google.gcloud.spi; -import com.google.gcloud.dns.DnsServiceOptions; +import com.google.gcloud.dns.DnsOptions; /** - * An interface for DnsServiceRpc factory. Implementation will be loaded via {@link + * An interface for DnsRpc factory. Implementation will be loaded via {@link * java.util.ServiceLoader}. */ -public interface DnsServiceRpcFactory extends ServiceRpcFactory { +public interface DnsRpcFactory extends ServiceRpcFactory { } From 762483b94f6c95aa3f860803ead53a962f41d336 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Fri, 29 Jan 2016 16:11:13 -0800 Subject: [PATCH 29/50] Makes ProjectInfo.Quota serializable. Fixed #599. --- .../src/main/java/com/google/gcloud/dns/ProjectInfo.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java index 4db0497946b1..f7b12b94bae8 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ProjectInfo.java @@ -44,8 +44,9 @@ public class ProjectInfo implements Serializable { * @see Google Cloud DNS * documentation */ - public static class Quota { + public static class Quota implements Serializable { + private static final long serialVersionUID = 6854685970605363639L; private final int zones; private final int resourceRecordsPerRrset; private final int rrsetAdditionsPerChange; From e17bedb4640e6d5c434670eb03a4ea6b2f9028c9 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Fri, 29 Jan 2016 17:50:18 -0800 Subject: [PATCH 30/50] Implemented DnsOptions up to two unavailable classes. --- .../com/google/gcloud/dns/DnsOptions.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java index 3663211d3b41..a5c689f4c719 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java @@ -16,7 +16,7 @@ package com.google.gcloud.dns; -import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableSet; import com.google.gcloud.ServiceOptions; import com.google.gcloud.spi.DnsRpc; import com.google.gcloud.spi.DnsRpcFactory; @@ -26,16 +26,28 @@ public class DnsOptions extends ServiceOptions { - private static final long serialVersionUID = -5311219368450107146L; - - // TODO(mderka) Finish implementation. Created issue #595. + private static final long serialVersionUID = -519128051411747771L; + private static final String GC_DNS_RW = "https://www.googleapis.com/auth/ndev.clouddns.readwrite"; + private static final String GC_DNS_R = "https://www.googleapis.com/auth/ndev.clouddns.readonly"; + private static final Set SCOPES = ImmutableSet.of(GC_DNS_RW, GC_DNS_R); public static class DefaultDnsFactory implements DnsFactory { private static final DnsFactory INSTANCE = new DefaultDnsFactory(); @Override public Dns create(DnsOptions options) { - // TODO(mderka) Implement. Created issue #595. + // TODO(mderka) Implement when DnsImpl is available. Created issue #595. + return null; + } + } + + public static class DefaultDnsRpcFactory implements DnsRpcFactory { + + private static final DnsRpcFactory INSTANCE = new DefaultDnsRpcFactory(); + + @Override + public DnsRpc create(DnsOptions options) { + // TODO(mderka) Implement when DefaultDnsRpc is available. Created issue #595. return null; } } @@ -60,11 +72,13 @@ private DnsOptions(Builder builder) { super(DnsFactory.class, DnsRpcFactory.class, builder); } + @SuppressWarnings("unchecked") @Override protected DnsFactory defaultServiceFactory() { return DefaultDnsFactory.INSTANCE; } + @SuppressWarnings("unchecked") @Override protected DnsRpcFactory defaultRpcFactory() { return null; @@ -72,10 +86,10 @@ protected DnsRpcFactory defaultRpcFactory() { @Override protected Set scopes() { - // TODO(mderka) Verify. - return Sets.newHashSet("ndev.clouddns.readwrite"); + return SCOPES; } + @SuppressWarnings("unchecked") @Override public Builder toBuilder() { return new Builder(this); From adf5c1cda7b849d7e1064dba7dae24e1fea5061d Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Mon, 1 Feb 2016 09:12:51 -0800 Subject: [PATCH 31/50] Added test for AbstractOption. --- .../main/java/com/google/gcloud/dns/Dns.java | 2 +- .../google/gcloud/dns/AbstractOptionTest.java | 70 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 737ec1a38699..76b11972bb7e 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -193,7 +193,7 @@ enum SortingOrder { DESCENDING, ASCENDING; public String selector() { - return this.name().toLowerCase(); + return name().toLowerCase(); } } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java new file mode 100644 index 000000000000..3c578c53d0d1 --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java @@ -0,0 +1,70 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.fail; + +import com.google.gcloud.spi.DnsRpc; + +import org.junit.Test; + +public class AbstractOptionTest { + + private static final DnsRpc.Option RPC_OPTION = DnsRpc.Option.DNS_TYPE; + private static final DnsRpc.Option ANOTHER_RPC_OPTION = DnsRpc.Option.DNS_NAME; + private static final String VALUE = "some value"; + private static final String OTHER_VALUE = "another value"; + private static final AbstractOption OPTION = new AbstractOption(RPC_OPTION, VALUE) { + }; + private static final AbstractOption OPTION_EQUALS = new AbstractOption(RPC_OPTION, VALUE) { + }; + private static final AbstractOption OPTION_NOT_EQUALS1 = + new AbstractOption(RPC_OPTION, OTHER_VALUE) { + }; + private static final AbstractOption OPTION_NOT_EQUALS2 = + new AbstractOption(ANOTHER_RPC_OPTION, VALUE) { + }; + + @Test + public void testEquals() { + assertEquals(OPTION, OPTION_EQUALS); + assertNotEquals(OPTION, OPTION_NOT_EQUALS1); + assertNotEquals(OPTION, OPTION_NOT_EQUALS2); + } + + @Test + public void testHashCode() { + assertEquals(OPTION.hashCode(), OPTION_EQUALS.hashCode()); + } + + @Test + public void testConstructor() { + assertEquals(RPC_OPTION, OPTION.rpcOption()); + assertEquals(VALUE, OPTION.value()); + try { + new AbstractOption(null, VALUE) { + }; + fail("Cannot build with empty option."); + } catch (NullPointerException e) { + // expected + } + new AbstractOption(RPC_OPTION, null) { + }; // null value is ok + } +} From a9cc927e002277face656af9f059175192d31c3d Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Mon, 1 Feb 2016 14:20:33 -0800 Subject: [PATCH 32/50] Implemented comments by @aozarov. Added test for option accessors. --- .../main/java/com/google/gcloud/dns/Dns.java | 86 ++++------- .../com/google/gcloud/dns/DnsOptions.java | 3 +- .../java/com/google/gcloud/spi/DnsRpc.java | 1 - .../java/com/google/gcloud/dns/DnsTest.java | 141 ++++++++++++++++++ 4 files changed, 173 insertions(+), 58 deletions(-) create mode 100644 gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 76b11972bb7e..352c7791e18d 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -31,12 +31,14 @@ */ public interface Dns extends Service { + + /** * The fields of a project. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code Dns#getProjectInfo(ProjectGetOption...)}. Project ID is always returned, even if - * not specified. + * {@code Dns#getProjectInfo(ProjectGetOption...)}. Project ID is always returned, even if not + * specified. */ enum ProjectField { PROJECT_ID("id"), @@ -67,8 +69,8 @@ static String selector(ProjectField... fields) { * The fields of a zone. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code Dns#getZone(BigInteger, ZoneFieldOption...)} or {@code Dns#getZone(String, - * ZoneFieldOption...)}. The ID is always returned, even if not specified. + * {@code Dns#getZone(BigInteger, ZoneOption...)} or {@code Dns#getZone(String, ZoneOption...)}. + * The ID is always returned, even if not specified. */ enum ZoneField { CREATION_TIME("creationTime"), @@ -104,8 +106,8 @@ static String selector(ZoneField... fields) { * *

These values can be used to specify the fields to include in a partial response when calling * {@code Dns#listDnsRecords(BigInteger, DnsRecordListOption...)} or {@code - * Dns#listDnsRecords(String, DnsRecordListOption...)}. The name is always returned even if - * not selected. + * Dns#listDnsRecords(String, DnsRecordListOption...)}. The name is always returned even if not + * selected. */ enum DnsRecordField { DNS_RECORDS("rrdatas"), @@ -137,9 +139,9 @@ static String selector(DnsRecordField... fields) { * The fields of a change request. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code Dns#applyChangeRequest(ChangeRequest, BigInteger, ChangeRequestOption...)} - * or {@code Dns#applyChangeRequest(ChangeRequest, String, ChangeRequestOption...)} - * The ID is always returned even if not selected. + * {@code Dns#applyChangeRequest(ChangeRequest, BigInteger, ChangeRequestOption...)} or {@code + * Dns#applyChangeRequest(ChangeRequest, String, ChangeRequestOption...)} The ID is always + * returned even if not selected. */ enum ChangeRequestField { ID("id"), @@ -168,24 +170,6 @@ static String selector(ChangeRequestField... fields) { } } - /** - * The sorting keys for listing change requests. The only currently supported sorting key is the - * when the change request was created. - */ - enum ChangeRequestSortingKey { - TIME_CREATED("changeSequence"); - - private final String selector; - - ChangeRequestSortingKey(String selector) { - this.selector = selector; - } - - String selector() { - return selector; - } - } - /** * The sorting order for listing. */ @@ -261,24 +245,23 @@ public static DnsRecordListOption type(DnsRecord.Type type) { /** * Class for specifying zone field options. */ - class ZoneFieldOption extends AbstractOption implements Serializable { + class ZoneOption extends AbstractOption implements Serializable { private static final long serialVersionUID = -8065564464895945037L; - ZoneFieldOption(DnsRpc.Option option, Object value) { + ZoneOption(DnsRpc.Option option, Object value) { super(option, value); } /** * Returns an option to specify the zones's fields to be returned by the RPC call. * - *

If this option is not provided all zone fields are returned. {@code - * ZoneFieldOption.fields} can be used to specify only the fields of interest. Zone ID is always - * returned, even if not specified. {@link ZoneField} provides a list of fields that can be - * used. + *

If this option is not provided all zone fields are returned. {@code ZoneOption.fields} can + * be used to specify only the fields of interest. Zone ID is always returned, even if not + * specified. {@link ZoneField} provides a list of fields that can be used. */ - public static ZoneFieldOption fields(ZoneField... fields) { - return new ZoneFieldOption(DnsRpc.Option.FIELDS, ZoneField.selector(fields)); + public static ZoneOption fields(ZoneField... fields) { + return new ZoneOption(DnsRpc.Option.FIELDS, ZoneField.selector(fields)); } } @@ -296,10 +279,9 @@ class ZoneListOption extends AbstractOption implements Serializable { /** * Returns an option to specify the zones's fields to be returned by the RPC call. * - *

If this option is not provided all zone fields are returned. {@code - * ZoneFieldOption.fields} can be used to specify only the fields of interest. Zone ID is always - * returned, even if not specified. {@link ZoneField} provides a list of fields that can be - * used. + *

If this option is not provided all zone fields are returned. {@code ZoneOption.fields} can + * be used to specify only the fields of interest. Zone ID is always returned, even if not + * specified. {@link ZoneField} provides a list of fields that can be used. */ public static ZoneListOption fields(ZoneField... fields) { return new ZoneListOption(DnsRpc.Option.FIELDS, ZoneField.selector(fields)); @@ -366,9 +348,9 @@ class ChangeRequestOption extends AbstractOption implements Serializable { * service. * *

If this option is not provided all change request fields are returned. {@code - * ChangeRequestOption.fields} can be used to specify only the fields of interest. The ID - * of the change request is always returned, even if not specified. {@link ChangeRequestField} - * provides a list of fields that can be used. + * ChangeRequestOption.fields} can be used to specify only the fields of interest. The ID of the + * change request is always returned, even if not specified. {@link ChangeRequestField} provides + * a list of fields that can be used. */ public static ChangeRequestOption fields(ChangeRequestField... fields) { return new ChangeRequestOption( @@ -394,9 +376,9 @@ class ChangeRequestListOption extends AbstractOption implements Serializable { * service. * *

If this option is not provided all change request fields are returned. {@code - * ChangeRequestOption.fields} can be used to specify only the fields of interest. The ID - * of the change request is always returned, even if not specified. {@link ChangeRequestField} - * provides a list of fields that can be used. + * ChangeRequestOption.fields} can be used to specify only the fields of interest. The ID of the + * change request is always returned, even if not specified. {@link ChangeRequestField} provides + * a list of fields that can be used. */ public static ChangeRequestListOption fields(ChangeRequestField... fields) { return new ChangeRequestListOption( @@ -427,16 +409,10 @@ public static ChangeRequestListOption pageSize(int pageSize) { } /** - * Returns an option for specifying the sorting criterion of change requests. Note the the only - * currently supported criterion is the change sequence. - */ - public static ChangeRequestListOption sortBy(ChangeRequestSortingKey key) { - return new ChangeRequestListOption(DnsRpc.Option.SORTING_KEY, key.selector()); - } - - /** - * Returns an option to specify whether the the change requests should be listed in ascending or - * descending order. + * Returns an option to specify whether the the change requests should be listed in ascending + * (most-recent last) or descending (most-recent first) order with respect to when the change + * request was accepted by the server. If this option is not provided, the listing order is + * undefined. */ public static ChangeRequestListOption sortOrder(SortingOrder order) { return new ChangeRequestListOption(DnsRpc.Option.SORTING_ORDER, order.selector()); diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java index a5c689f4c719..1845467c2537 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java @@ -28,8 +28,7 @@ public class DnsOptions private static final long serialVersionUID = -519128051411747771L; private static final String GC_DNS_RW = "https://www.googleapis.com/auth/ndev.clouddns.readwrite"; - private static final String GC_DNS_R = "https://www.googleapis.com/auth/ndev.clouddns.readonly"; - private static final Set SCOPES = ImmutableSet.of(GC_DNS_RW, GC_DNS_R); + private static final Set SCOPES = ImmutableSet.of(GC_DNS_RW); public static class DefaultDnsFactory implements DnsFactory { private static final DnsFactory INSTANCE = new DefaultDnsFactory(); diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java index 02afb7309c6a..f6a0f330a327 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java @@ -26,7 +26,6 @@ enum Option { PAGE_TOKEN("pageToken"), DNS_NAME("dnsName"), DNS_TYPE("type"), - SORTING_KEY("sortBy"), SORTING_ORDER("sortOrder"); private final String value; diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java new file mode 100644 index 000000000000..2e98dbd46de4 --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java @@ -0,0 +1,141 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import com.google.gcloud.spi.DnsRpc; + +import org.junit.Test; + +public class DnsTest { + + private static final Integer PAGE_SIZE = 20; + private static final String PAGE_TOKEN = "page token"; + + @Test + public void testDnsRecordListOption() { + // dns name + String dnsName = "some name"; + Dns.DnsRecordListOption dnsRecordListOption = Dns.DnsRecordListOption.dnsName(dnsName); + assertEquals(dnsName, dnsRecordListOption.value()); + assertEquals(DnsRpc.Option.DNS_NAME, dnsRecordListOption.rpcOption()); + // page token + dnsRecordListOption = Dns.DnsRecordListOption.pageToken(PAGE_TOKEN); + assertEquals(PAGE_TOKEN, dnsRecordListOption.value()); + assertEquals(DnsRpc.Option.PAGE_TOKEN, dnsRecordListOption.rpcOption()); + // page size + dnsRecordListOption = Dns.DnsRecordListOption.pageSize(PAGE_SIZE); + assertEquals(PAGE_SIZE, dnsRecordListOption.value()); + assertEquals(DnsRpc.Option.PAGE_SIZE, dnsRecordListOption.rpcOption()); + // record type + DnsRecord.Type recordType = DnsRecord.Type.AAAA; + dnsRecordListOption = Dns.DnsRecordListOption.type(recordType); + assertEquals(recordType, dnsRecordListOption.value()); + assertEquals(DnsRpc.Option.DNS_TYPE, dnsRecordListOption.rpcOption()); + // fields + dnsRecordListOption = Dns.DnsRecordListOption.fields(Dns.DnsRecordField.NAME, + Dns.DnsRecordField.TTL); + assertEquals(DnsRpc.Option.FIELDS, dnsRecordListOption.rpcOption()); + assertTrue(dnsRecordListOption.value() instanceof String); + assertTrue(((String) dnsRecordListOption.value()).contains( + Dns.DnsRecordField.NAME.selector())); + assertTrue(((String) dnsRecordListOption.value()).contains( + Dns.DnsRecordField.TTL.selector())); + assertTrue(((String) dnsRecordListOption.value()).contains( + Dns.DnsRecordField.NAME.selector())); + } + + @Test + public void testZoneOption() { + Dns.ZoneOption fields = Dns.ZoneOption.fields(Dns.ZoneField.CREATION_TIME, + Dns.ZoneField.DESCRIPTION); + assertEquals(DnsRpc.Option.FIELDS, fields.rpcOption()); + assertTrue(fields.value() instanceof String); + assertTrue(((String) fields.value()).contains(Dns.ZoneField.CREATION_TIME.selector())); + assertTrue(((String) fields.value()).contains(Dns.ZoneField.DESCRIPTION.selector())); + } + + @Test + public void testZoneList() { + // fields + Dns.ZoneListOption fields = Dns.ZoneListOption.fields(Dns.ZoneField.CREATION_TIME, + Dns.ZoneField.DESCRIPTION); + assertEquals(DnsRpc.Option.FIELDS, fields.rpcOption()); + assertTrue(fields.value() instanceof String); + assertTrue(((String) fields.value()).contains(Dns.ZoneField.CREATION_TIME.selector())); + assertTrue(((String) fields.value()).contains(Dns.ZoneField.DESCRIPTION.selector())); + assertTrue(((String) fields.value()).contains(Dns.ZoneField.ZONE_ID.selector())); + // page token + Dns.ZoneListOption option = Dns.ZoneListOption.pageToken(PAGE_TOKEN); + assertEquals(PAGE_TOKEN, option.value()); + assertEquals(DnsRpc.Option.PAGE_TOKEN, option.rpcOption()); + // page size + option = Dns.ZoneListOption.pageSize(PAGE_SIZE); + assertEquals(PAGE_SIZE, option.value()); + assertEquals(DnsRpc.Option.PAGE_SIZE, option.rpcOption()); + } + + @Test + public void testProjectGetOption() { + // fields + Dns.ProjectGetOption fields = Dns.ProjectGetOption.fields(Dns.ProjectField.QUOTA); + assertEquals(DnsRpc.Option.FIELDS, fields.rpcOption()); + assertTrue(fields.value() instanceof String); + assertTrue(((String) fields.value()).contains(Dns.ProjectField.QUOTA.selector())); + assertTrue(((String) fields.value()).contains(Dns.ProjectField.PROJECT_ID.selector())); + } + + @Test + public void testChangeRequestOption() { + // fields + Dns.ChangeRequestOption fields = Dns.ChangeRequestOption.fields( + Dns.ChangeRequestField.START_TIME, Dns.ChangeRequestField.STATUS); + assertEquals(DnsRpc.Option.FIELDS, fields.rpcOption()); + assertTrue(fields.value() instanceof String); + assertTrue(((String) fields.value()).contains( + Dns.ChangeRequestField.START_TIME.selector())); + assertTrue(((String) fields.value()).contains(Dns.ChangeRequestField.STATUS.selector())); + assertTrue(((String) fields.value()).contains(Dns.ChangeRequestField.ID.selector())); + } + + @Test + public void testChangeRequestListOption() { + // fields + Dns.ChangeRequestListOption fields = Dns.ChangeRequestListOption.fields( + Dns.ChangeRequestField.START_TIME, Dns.ChangeRequestField.STATUS); + assertEquals(DnsRpc.Option.FIELDS, fields.rpcOption()); + assertTrue(fields.value() instanceof String); + assertTrue(((String) fields.value()).contains( + Dns.ChangeRequestField.START_TIME.selector())); + assertTrue(((String) fields.value()).contains(Dns.ChangeRequestField.STATUS.selector())); + assertTrue(((String) fields.value()).contains(Dns.ChangeRequestField.ID.selector())); + // page token + Dns.ChangeRequestListOption option = Dns.ChangeRequestListOption.pageToken(PAGE_TOKEN); + assertEquals(PAGE_TOKEN, option.value()); + assertEquals(DnsRpc.Option.PAGE_TOKEN, option.rpcOption()); + // page size + option = Dns.ChangeRequestListOption.pageSize(PAGE_SIZE); + assertEquals(PAGE_SIZE, option.value()); + assertEquals(DnsRpc.Option.PAGE_SIZE, option.rpcOption()); + // sort order + option = Dns.ChangeRequestListOption.sortOrder(Dns.SortingOrder.ASCENDING); + assertEquals(DnsRpc.Option.SORTING_ORDER, option.rpcOption()); + assertEquals(Dns.SortingOrder.ASCENDING.selector(), option.value()); + } +} From 6ecde35c355ca8e38e726044e9a0012f5a3935ab Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Mon, 1 Feb 2016 16:07:24 -0800 Subject: [PATCH 33/50] Comments by @aozarov second round. --- .../main/java/com/google/gcloud/dns/Dns.java | 15 ++++++----- .../google/gcloud/dns/AbstractOptionTest.java | 26 +++++++------------ 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 352c7791e18d..28e79104cf58 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -24,6 +24,8 @@ import java.io.Serializable; import java.util.Set; +import static com.google.gcloud.dns.Dns.ZoneField.selector; + /** * An interface for the Google Cloud DNS service. * @@ -31,8 +33,6 @@ */ public interface Dns extends Service { - - /** * The fields of a project. * @@ -284,7 +284,9 @@ class ZoneListOption extends AbstractOption implements Serializable { * specified. {@link ZoneField} provides a list of fields that can be used. */ public static ZoneListOption fields(ZoneField... fields) { - return new ZoneListOption(DnsRpc.Option.FIELDS, ZoneField.selector(fields)); + StringBuilder builder = new StringBuilder(); + builder.append("managedZones(").append(selector(fields)).append(')'); + return new ZoneListOption(DnsRpc.Option.FIELDS, builder.toString()); } /** @@ -381,10 +383,9 @@ class ChangeRequestListOption extends AbstractOption implements Serializable { * a list of fields that can be used. */ public static ChangeRequestListOption fields(ChangeRequestField... fields) { - return new ChangeRequestListOption( - DnsRpc.Option.FIELDS, - ChangeRequestField.selector(fields) - ); + StringBuilder builder = new StringBuilder(); + builder.append("changes(").append(ChangeRequestField.selector(fields)).append(')'); + return new ChangeRequestListOption(DnsRpc.Option.FIELDS, builder.toString()); } /** diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java index 3c578c53d0d1..e3f2896bd10b 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java @@ -16,30 +16,26 @@ package com.google.gcloud.dns; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.fail; - import com.google.gcloud.spi.DnsRpc; import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.fail; + public class AbstractOptionTest { private static final DnsRpc.Option RPC_OPTION = DnsRpc.Option.DNS_TYPE; private static final DnsRpc.Option ANOTHER_RPC_OPTION = DnsRpc.Option.DNS_NAME; private static final String VALUE = "some value"; private static final String OTHER_VALUE = "another value"; - private static final AbstractOption OPTION = new AbstractOption(RPC_OPTION, VALUE) { - }; - private static final AbstractOption OPTION_EQUALS = new AbstractOption(RPC_OPTION, VALUE) { - }; + private static final AbstractOption OPTION = new AbstractOption(RPC_OPTION, VALUE) {}; + private static final AbstractOption OPTION_EQUALS = new AbstractOption(RPC_OPTION, VALUE) {}; private static final AbstractOption OPTION_NOT_EQUALS1 = - new AbstractOption(RPC_OPTION, OTHER_VALUE) { - }; + new AbstractOption(RPC_OPTION, OTHER_VALUE) {}; private static final AbstractOption OPTION_NOT_EQUALS2 = - new AbstractOption(ANOTHER_RPC_OPTION, VALUE) { - }; + new AbstractOption(ANOTHER_RPC_OPTION, VALUE) {}; @Test public void testEquals() { @@ -58,13 +54,11 @@ public void testConstructor() { assertEquals(RPC_OPTION, OPTION.rpcOption()); assertEquals(VALUE, OPTION.value()); try { - new AbstractOption(null, VALUE) { - }; + new AbstractOption(null, VALUE) {}; fail("Cannot build with empty option."); } catch (NullPointerException e) { // expected } - new AbstractOption(RPC_OPTION, null) { - }; // null value is ok + new AbstractOption(RPC_OPTION, null) {}; // null value is ok } } From a69101a80df1637361b02a93233d0ad3e5d69098 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Mon, 1 Feb 2016 16:18:16 -0800 Subject: [PATCH 34/50] Added Dns methods. Fixes #596. Added Zone and ZoneTest --- .../main/java/com/google/gcloud/dns/Dns.java | 194 ++++- .../main/java/com/google/gcloud/dns/Zone.java | 256 ++++++ .../google/gcloud/dns/AbstractOptionTest.java | 8 +- .../java/com/google/gcloud/dns/ZoneTest.java | 750 ++++++++++++++++++ 4 files changed, 1200 insertions(+), 8 deletions(-) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java create mode 100644 gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 28e79104cf58..b48e4b0a90f2 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -18,14 +18,14 @@ import com.google.common.base.Joiner; import com.google.common.collect.Sets; +import com.google.gcloud.Page; import com.google.gcloud.Service; import com.google.gcloud.spi.DnsRpc; import java.io.Serializable; +import java.math.BigInteger; import java.util.Set; -import static com.google.gcloud.dns.Dns.ZoneField.selector; - /** * An interface for the Google Cloud DNS service. * @@ -285,7 +285,7 @@ class ZoneListOption extends AbstractOption implements Serializable { */ public static ZoneListOption fields(ZoneField... fields) { StringBuilder builder = new StringBuilder(); - builder.append("managedZones(").append(selector(fields)).append(')'); + builder.append("managedZones(").append(ZoneField.selector(fields)).append(')'); return new ZoneListOption(DnsRpc.Option.FIELDS, builder.toString()); } @@ -420,5 +420,191 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { } } - // TODO(mderka) Add methods. Created issue #596. + /** + * Creates a new zone. + * + * @return ZoneInfo object representing the new zone's metadata. In addition to the name, dns name + * and description (supplied by the user within the {@code zoneInfo} parameter, the returned + * object will include the following read-only fields supplied by the server: creation time, id, + * and list of name servers. + * @throws DnsException upon failure + * @see Cloud DNS Managed Zones: + * create + */ + ZoneInfo create(ZoneInfo zoneInfo); + + /** + * Retrieves the zone by the specified zone name. Returns {@code null} is the zone is not found. + * The returned fields can be optionally restricted by specifying {@code ZoneFieldOptions}. + * + * @throws DnsException upon failure + * @see Cloud DNS Managed Zones: + * get + */ + ZoneInfo getZone(String zoneName, ZoneOption... options); + + /** + * Retrieves the zone by the specified zone name. Returns {@code null} is the zone is not found. + * The returned fields can be optionally restricted by specifying {@code ZoneFieldOptions}. + * + * @throws DnsException upon failure + * @see Cloud DNS Managed Zones: + * get + */ + ZoneInfo getZone(BigInteger zoneId, ZoneOption... options); + + /** + * Lists the zoned inside the project. + * + *

This method returns zone in an unspecified order. New zones do not necessarily appear at the + * end of the list. Use {@link ZoneListOption} to restrict the listing to a domain name, set page + * size, and set page tokens. + * + * @return {@code Page}, a page of zones + * @throws DnsException upon failure + * @see Cloud DNS Managed Zones: + * list + */ + Page listZones(ZoneListOption... options); + + /** + * Deletes an existing zone identified by name. Returns true if the zone was successfully deleted + * and false otherwise. + * + * @return {@code true} if zone was found and deleted and false otherwise + * @throws DnsException upon failure + * @see Cloud DNS Managed Zones: + * delete + */ + boolean delete(String zoneName); // delete does not admit any options + + /** + * Deletes an existing zone identified by id. Returns true if the zone was successfully deleted + * and false otherwise. + * + * @return {@code true} if zone was found and deleted and false otherwise + * @throws DnsException upon failure + * @see Cloud DNS Managed Zones: + * delete + */ + boolean delete(BigInteger zoneId); // delete does not admit any options + + /** + * Lists the DNS records in the zone identified by name. + * + *

The fields to be returned, page size and page tokens can be specified using {@code + * DnsRecordOptions}. Returns null if the zone cannot be found. + * + * @throws DnsException upon failure + * @see Cloud DNS + * ResourceRecordSets: list + */ + Page listDnsRecords(String zoneName, DnsRecordListOption... options); + + /** + * Lists the DNS records in the zone identified by ID. + * + *

The fields to be returned, page size and page tokens can be specified using {@code + * DnsRecordOptions}. Returns null if the zone cannot be found. + * + * @throws DnsException upon failure + * @see Cloud DNS + * ResourceRecordSets: list + */ + Page listDnsRecords(BigInteger zoneId, DnsRecordListOption... options); + + /** + * Retrieves the metadata about the current project. The returned fields can be optionally + * restricted by specifying {@code ProjectOptions}. + * + * @throws DnsException upon failure + * @see Cloud DNS Projects: get + */ + ProjectInfo getProjectInfo(ProjectGetOption... fields); + + /** + * Returns the current project id. + */ + String getProjectId(); + + /** + * Returns the current project number. + */ + BigInteger getProjectNumber(); + + /** + * Submits a change requests for applying to the zone identified by ID to the service. The + * returned object contains the following read-only fields supplied by the server: id, start time + * and status. time, id, and list of name servers. The returned fields can be modified by {@code + * ChangeRequestFieldOptions}. Returns null if the zone is not found. + * + * @return ChangeRequest object representing the new change request or null if zone is not found + * @throws DnsException upon failure + * @see Cloud DNS Changes: create + */ + ChangeRequest applyChangeRequest(ChangeRequest changeRequest, BigInteger zoneId, + ChangeRequestOption... options); + + /** + * Submits a change requests for applying to the zone identified by name to the service. The + * returned object contains the following read-only fields supplied by the server: id, start time + * and status. time, id, and list of name servers. The returned fields can be modified by {@code + * ChangeRequestFieldOptions}. Returns null if the zone is not found. + * + * @return ChangeRequest object representing the new change request or null if zone is not found + * @throws DnsException upon failure + * @see Cloud DNS Changes: create + */ + ChangeRequest applyChangeRequest(ChangeRequest changeRequest, String zoneName, + ChangeRequestOption... options); + + /** + * Retrieves updated information about a change request previously submitted for a zone identified + * by ID. Returns null if the zone or request cannot be found. + * + *

The fields to be returned using {@code ChangeRequestFieldOptions}. + * + * @throws DnsException upon failure + * @see Cloud DNS Chages: get + */ + ChangeRequest getChangeRequest(ChangeRequest changeRequest, BigInteger zoneId, + ChangeRequestOption... options); + + /** + * Retrieves updated information about a change request previously submitted for a zone identified + * by name. Returns null if the zone or request cannot be found. + * + *

The fields to be returned using {@code ChangeRequestFieldOptions}. + * + * @throws DnsException upon failure + * @see Cloud DNS Chages: get + */ + ChangeRequest getChangeRequest(ChangeRequest changeRequest, String zoneName, + ChangeRequestOption... options); + + /** + * Lists the change requests for the zone identified by ID that were submitted to the service. + * + *

The sorting key for changes, fields to be returned, page and page tokens can be specified + * using {@code ChangeRequestListOptions}. Note that the only sorting key currently supported is + * the timestamp of submitting the change request to the service. + * + * @return {@code Page}, a page of change requests + * @throws DnsException upon failure + * @see Cloud DNS Chages: list + */ + Page listChangeRequests(BigInteger zoneId, ChangeRequestListOption... options); + + /** + * Lists the change requests for the zone identified by name that were submitted to the service. + * + *

The sorting key for changes, fields to be returned, page and page tokens can be specified + * using {@code ChangeRequestListOptions}. Note that the only sorting key currently supported is + * the timestamp of submitting the change request to the service. + * + * @return {@code Page}, a page of change requests + * @throws DnsException upon failure + * @see Cloud DNS Chages: list + */ + Page listChangeRequests(String zoneName, ChangeRequestListOption... options); } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java new file mode 100644 index 000000000000..f4d9702ba12f --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -0,0 +1,256 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.gcloud.Page; + +import java.io.Serializable; +import java.math.BigInteger; + +/** + * A Google Cloud DNS Zone object. + * + *

A zone is the container for all of your DNS records that share the same DNS name prefix, for + * example, example.com. Zones are automatically assigned a set of name servers when they are + * created to handle responding to DNS queries for that zone. A zone has quotas for the number of + * resource records that it can include. + * + * @see Google Cloud DNS managed zone + * documentation + */ +public class Zone implements Serializable { + + // TODO(mderka) Zone and zoneInfo to be merged. Opened issue #605. + + private static final long serialVersionUID = -4012581571095484813L; + private final ZoneInfo zoneInfo; + private final Dns dns; + + /** + * Constructs a {@code Zone} object that contains the given {@code zoneInfo}. + */ + public Zone(Dns dns, ZoneInfo zoneInfo) { + this.zoneInfo = checkNotNull(zoneInfo); + this.dns = checkNotNull(dns); + } + + /** + * Constructs a {@code Zone} object that contains meta information received from the Google Cloud + * DNS service for the provided zoneName. + * + * @param zoneName Name of the zone to be searched for + * @param options Optional restriction on what fields should be returned by the service + * @return Zone object containing metadata or null if not not found + * @throws DnsException upon failure + */ + public static Zone get(Dns dnsService, String zoneName, + Dns.ZoneOption... options) { + checkNotNull(zoneName); + checkNotNull(dnsService); + ZoneInfo zoneInfo = dnsService.getZone(zoneName, options); + return zoneInfo == null ? null : new Zone(dnsService, zoneInfo); + } + + /** + * Constructs a {@code Zone} object that contains meta information received from the Google Cloud + * DNS service for the provided zoneName. + * + * @param zoneId ID of the zone to be searched for + * @param options Optional restriction on what fields should be returned by the service + * @return Zone object containing metadata or null if not not found + * @throws DnsException upon failure + */ + public static Zone get(Dns dnsService, BigInteger zoneId, + Dns.ZoneOption... options) { + checkNotNull(zoneId); + checkNotNull(dnsService); + ZoneInfo zoneInfo = dnsService.getZone(zoneId, options); + return zoneInfo == null ? null : new Zone(dnsService, zoneInfo); + } + + /** + * Retrieves the latest information about the zone. The method first attempts to retrieve the zone + * by ID and if not set or zone is not found, it searches by name. + * + * @param options Optional restriction on what fields should be fetched + * @return Zone object containing updated metadata or null if not not found + * @throws DnsException upon failure + * @throws NullPointerException if both zone ID and name are not initialized + */ + public Zone reload(Dns.ZoneOption... options) { + checkNameOrIdNotNull(); + Zone zone = null; + if (zoneInfo.id() != null) { + zone = Zone.get(dns, zoneInfo.id(), options); + } + if (zone == null && zoneInfo.name() != null) { + // zone was not found by id or id is not set at all + zone = Zone.get(dns, zoneInfo.name(), options); + } + return zone; + } + + /** + * Deletes the zone. The method first attempts to delete the zone by ID. If the zone is not found + * or id is not set, it attempts to delete by name. + * + * @return true is zone was found and deleted and false otherwise + * @throws DnsException upon failure + * @throws NullPointerException if both zone ID and name are not initialized + */ + public boolean delete() { + checkNameOrIdNotNull(); + boolean deleted = false; + if (zoneInfo.id() != null) { + deleted = dns.delete(zoneInfo.id()); + } + if (!deleted && zoneInfo.name() != null) { + // zone was not found by id or id is not set at all + deleted = dns.delete(zoneInfo.name()); + } + return deleted; + } + + /** + * Lists all {@link DnsRecord}s associated with this zone. First searches for zone by ID and if + * not found then by name. + * + * @param options Optional restriction on listing and on what fields of {@link DnsRecord} should + * be returned by the service + * @return {@code Page}, a page of DNS records, or null if the zone is not found + * @throws DnsException upon failure + * @throws NullPointerException if both zone ID and name are not initialized + */ + public Page listDnsRecords(Dns.DnsRecordListOption... options) { + checkNameOrIdNotNull(); + Page page = null; + if (zoneInfo.id() != null) { + page = dns.listDnsRecords(zoneInfo.id(), options); + } + if (page == null && zoneInfo.name() != null) { + // zone was not found by id or id is not set at all + page = dns.listDnsRecords(zoneInfo.name(), options); + } + return page; + } + + /** + * Submits {@link ChangeRequest} to the service for it to applied to this zone. First searches for + * the zone by ID and if not found then by name. Returns a {@link ChangeRequest} with + * server-assigned ID or null if the zone was not found. + * + * @param options Optional restriction on what fields of {@link ChangeRequest} should be returned + * by the service + * @return ChangeRequest with server-assigned ID or null if the zone was not found. + * @throws DnsException upon failure + * @throws NullPointerException if both zone ID and name are not initialized + */ + public ChangeRequest applyChangeRequest(ChangeRequest changeRequest, + Dns.ChangeRequestOption... options) { + checkNameOrIdNotNull(); + checkNotNull(changeRequest); + ChangeRequest updated = null; + if (zoneInfo.id() != null) { + updated = dns.applyChangeRequest(changeRequest, zoneInfo.id(), options); + } + if (updated == null && zoneInfo.name() != null) { + // zone was not found by id or id is not set at all + updated = dns.applyChangeRequest(changeRequest, zoneInfo.name(), options); + } + return updated; + } + + /** + * Retrieves an updated information about a change request previously submitted to be applied to + * this zone. First searches for the zone by ID and if not found then by name. Returns a {@link + * ChangeRequest} if found and null is the zone or the change request was not found. + * + * @param options Optional restriction on what fields of {@link ChangeRequest} should be returned + * by the service + * @return ChangeRequest with updated information of null if the change request or zone was not + * found. + * @throws DnsException upon failure + * @throws NullPointerException if both zone ID and name are not initialized + * @throws NullPointerException if the change request does not have initialized id + */ + public ChangeRequest getChangeRequest(ChangeRequest changeRequest, + Dns.ChangeRequestOption... options) { + checkNameOrIdNotNull(); + checkNotNull(changeRequest); + checkNotNull(changeRequest.id()); + ChangeRequest updated = null; + if (zoneInfo.id() != null) { + updated = dns.getChangeRequest(changeRequest, zoneInfo.id(), options); + } + if (updated == null && zoneInfo.name() != null) { + // zone was not found by id or id is not set at all + updated = dns.getChangeRequest(changeRequest, zoneInfo.name(), options); + } + return updated; + } + + /** + * Retrieves all change requests for this zone. First searches for the zone by ID and if not found + * then by name. Returns a page of {@link ChangeRequest}s or null if the zone is not found. + * + * @param options Optional restriction on listing and on what fields of {@link ChangeRequest}s + * should be returned by the service + * @return {@code Page}, a page of change requests, or null if the zone is not + * found + * @throws DnsException upon failure + * @throws NullPointerException if both zone ID and name are not initialized + */ + public Page listChangeRequests(Dns.ChangeRequestListOption... options) { + checkNameOrIdNotNull(); + Page changeRequests = null; + if (zoneInfo.id() != null) { + changeRequests = dns.listChangeRequests(zoneInfo.id(), options); + } + if (changeRequests == null && zoneInfo.name() != null) { + // zone was not found by id or id is not set at all + changeRequests = dns.listChangeRequests(zoneInfo.name(), options); + } + return changeRequests; + } + + /** + * Check that at least one of name and ID are initialized and throw and exception if not. + */ + private void checkNameOrIdNotNull() { + if (zoneInfo != null && zoneInfo.id() == null && zoneInfo.name() == null) { + throw new NullPointerException("Both zoneInfo.id and zoneInfo.name are null. " + + "This is an inconsistent state which should never happen."); + } + } + + /** + * Returns the {@link ZoneInfo} object containing meta information about this managed zone. + */ + public ZoneInfo info() { + return this.zoneInfo; + } + + /** + * Returns the {@link Dns} service object associated with this managed zone. + */ + public Dns dns() { + return this.dns; + } + +} diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java index e3f2896bd10b..09e35527879b 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/AbstractOptionTest.java @@ -16,14 +16,14 @@ package com.google.gcloud.dns; -import com.google.gcloud.spi.DnsRpc; - -import org.junit.Test; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.fail; +import com.google.gcloud.spi.DnsRpc; + +import org.junit.Test; + public class AbstractOptionTest { private static final DnsRpc.Option RPC_OPTION = DnsRpc.Option.DNS_TYPE; diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java new file mode 100644 index 000000000000..5f9d119e6150 --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java @@ -0,0 +1,750 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static org.easymock.EasyMock.createStrictMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import com.google.gcloud.Page; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.math.BigInteger; + +public class ZoneTest { + + private static final String ZONE_NAME = "dns-zone-name"; + private static final BigInteger ZONE_ID = new BigInteger("123"); + private static final ZoneInfo ZONE_INFO = ZoneInfo.builder(ZONE_NAME, ZONE_ID) + .dnsName("example.com") + .creationTimeMillis(123478946464L) + .build(); + private static final ZoneInfo NO_ID_INFO = ZoneInfo.builder(ZONE_NAME) + .dnsName("anoter-example.com") + .creationTimeMillis(893123464L) + .build(); + private static final ZoneInfo NO_NAME_INFO = ZoneInfo.builder(ZONE_ID) + .dnsName("one-more-example.com") + .creationTimeMillis(875221546464L) + .build(); + private static final Dns.ZoneOption ZONE_FIELD_OPTIONS = + Dns.ZoneOption.fields(Dns.ZoneField.CREATION_TIME); + private static final Dns.DnsRecordListOption DNS_RECORD_OPTIONS = + Dns.DnsRecordListOption.dnsName("some-dns"); + private static final Dns.ChangeRequestOption CHANGE_REQUEST_FIELD_OPTIONS = + Dns.ChangeRequestOption.fields(Dns.ChangeRequestField.START_TIME); + private static final Dns.ChangeRequestListOption CHANGE_REQUEST_LIST_OPTIONS = + Dns.ChangeRequestListOption.fields(Dns.ChangeRequestField.START_TIME); + private static final ChangeRequest CHANGE_REQUEST = ChangeRequest.builder().id("someid").build(); + private static final ChangeRequest CHANGE_REQUEST_AFTER = CHANGE_REQUEST.toBuilder() + .startTimeMillis(123465L).build(); + private static final ChangeRequest CHANGE_REQUEST_NO_ID = ChangeRequest.builder().build(); + + private Dns dns; + private Zone zone; + private Zone zoneNoName; + private Zone zoneNoId; + + @Before + public void setUp() throws Exception { + dns = createStrictMock(Dns.class); + zone = new Zone(dns, ZONE_INFO); + zoneNoId = new Zone(dns, NO_ID_INFO); + zoneNoName = new Zone(dns, NO_NAME_INFO); + } + + @After + public void tearDown() throws Exception { + verify(dns); + } + + @Test + public void testConstructor() { + replay(dns); + assertNotNull(zone.info()); + assertEquals(ZONE_INFO, zone.info()); + assertNotNull(zone.dns()); + assertEquals(dns, zone.dns()); + } + + @Test + public void testGetById() { + expect(dns.getZone(ZONE_ID)).andReturn(ZONE_INFO); + expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(ZONE_INFO); // for options + replay(dns); + Zone retrieved = Zone.get(dns, ZONE_ID); + assertSame(dns, retrieved.dns()); + assertEquals(ZONE_INFO, retrieved.info()); + BigInteger id = null; + try { + Zone.get(dns, id); + fail("Cannot get null zone."); + } catch (NullPointerException e) { + // expected + } + try { + Zone.get(null, id); + fail("Cannot get null zone."); + } catch (NullPointerException e) { + // expected + } + // test passing options + Zone.get(dns, ZONE_ID, ZONE_FIELD_OPTIONS); + } + + @Test + public void testGetByName() { + expect(dns.getZone(ZONE_NAME)).andReturn(ZONE_INFO); + expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(ZONE_INFO); // for options + replay(dns); + Zone retrieved = Zone.get(dns, ZONE_NAME); + assertSame(dns, retrieved.dns()); + assertEquals(ZONE_INFO, retrieved.info()); + String name = null; + try { + Zone.get(dns, name); + fail("Cannot get null zone."); + } catch (NullPointerException e) { + // expected + } + try { + Zone.get(null, name); + fail("Cannot get null zone."); + } catch (NullPointerException e) { + // expected + } + // test passing options + Zone.get(dns, ZONE_ID, ZONE_FIELD_OPTIONS); + } + + @Test + public void deleteByIdAndFound() { + expect(dns.delete(ZONE_ID)).andReturn(true); + replay(dns); + boolean result = zone.delete(); + assertTrue(result); + } + + @Test + public void deleteByIdAndNotFoundAndNameSetAndFound() { + expect(dns.delete(ZONE_ID)).andReturn(false); + expect(dns.delete(ZONE_NAME)).andReturn(true); + replay(dns); + boolean result = zone.delete(); + assertTrue(result); + } + + @Test + public void deleteByIdAndNotFoundAndNameSetAndNotFound() { + expect(dns.delete(ZONE_ID)).andReturn(false); + expect(dns.delete(ZONE_NAME)).andReturn(false); + replay(dns); + boolean result = zone.delete(); + assertFalse(result); + } + + @Test + public void deleteByIdAndNotFoundAndNameNotSet() { + expect(dns.delete(ZONE_ID)).andReturn(false); + replay(dns); + boolean result = zoneNoName.delete(); + assertFalse(result); + } + + @Test + public void deleteByNameAndFound() { + expect(dns.delete(ZONE_NAME)).andReturn(true); + replay(dns); + boolean result = zoneNoId.delete(); + assertTrue(result); + } + + @Test + public void deleteByNameAndNotFound() { + expect(dns.delete(ZONE_NAME)).andReturn(true); + replay(dns); + boolean result = zoneNoId.delete(); + assertTrue(result); + } + + @Test + public void listDnsRecordsByIdAndFound() { + Page pageMock = createStrictMock(Page.class); + replay(pageMock); + expect(dns.listDnsRecords(ZONE_ID)).andReturn(pageMock); + // again for options + expect(dns.listDnsRecords(ZONE_ID, DNS_RECORD_OPTIONS)).andReturn(pageMock); + replay(dns); + Page result = zone.listDnsRecords(); + assertSame(pageMock, result); + verify(pageMock); + // verify options + zone.listDnsRecords(DNS_RECORD_OPTIONS); + } + + @Test + public void listDnsRecordsByIdAndNotFoundAndNameSetAndFound() { + Page pageMock = createStrictMock(Page.class); + replay(pageMock); + expect(dns.listDnsRecords(ZONE_ID)).andReturn(null); + expect(dns.listDnsRecords(ZONE_NAME)).andReturn(pageMock); + // again for options + expect(dns.listDnsRecords(ZONE_ID, DNS_RECORD_OPTIONS)).andReturn(null); + expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andReturn(pageMock); + replay(dns); + Page result = zone.listDnsRecords(); + assertSame(pageMock, result); + verify(pageMock); + // verify options + zone.listDnsRecords(DNS_RECORD_OPTIONS); + } + + @Test + public void listDnsRecordsByIdAndNotFoundAndNameSetAndNotFound() { + expect(dns.listDnsRecords(ZONE_ID)).andReturn(null); + expect(dns.listDnsRecords(ZONE_NAME)).andReturn(null); + // again for options + expect(dns.listDnsRecords(ZONE_ID, DNS_RECORD_OPTIONS)).andReturn(null); + expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andReturn(null); + replay(dns); + Page result = zone.listDnsRecords(); + assertNull(result); + // check options + zone.listDnsRecords(DNS_RECORD_OPTIONS); + } + + @Test + public void listDnsRecordsByIdAndNotFoundAndNameNotSet() { + expect(dns.listDnsRecords(ZONE_ID)).andReturn(null); + expect(dns.listDnsRecords(ZONE_ID, DNS_RECORD_OPTIONS)).andReturn(null); // for options + replay(dns); + Page result = zoneNoName.listDnsRecords(); + assertNull(result); + zoneNoName.listDnsRecords(DNS_RECORD_OPTIONS); // check options + } + + @Test + public void listDnsRecordsByNameAndFound() { + Page pageMock = createStrictMock(Page.class); + replay(pageMock); + expect(dns.listDnsRecords(ZONE_NAME)).andReturn(pageMock); + // again for options + expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andReturn(pageMock); + replay(dns); + Page result = zoneNoId.listDnsRecords(); + assertSame(pageMock, result); + verify(pageMock); + zoneNoId.listDnsRecords(DNS_RECORD_OPTIONS); // check options + } + + @Test + public void listDnsRecordsByNameAndNotFound() { + expect(dns.listDnsRecords(ZONE_NAME)).andReturn(null); + // again for options + expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andReturn(null); + replay(dns); + Page result = zoneNoId.listDnsRecords(); + assertNull(result); + zoneNoId.listDnsRecords(DNS_RECORD_OPTIONS); // check options + } + + @Test + public void reloadByIdAndFound() { + expect(dns.getZone(ZONE_ID)).andReturn(zone.info()); + expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(zone.info()); // for options + replay(dns); + Zone result = zone.reload(); + assertSame(zone.dns(), result.dns()); + assertEquals(zone.info(), result.info()); + zone.reload(ZONE_FIELD_OPTIONS); // for options + } + + @Test + public void reloadByIdAndNotFoundAndNameSetAndFound() { + expect(dns.getZone(ZONE_ID)).andReturn(null); + expect(dns.getZone(ZONE_NAME)).andReturn(zone.info()); + // again for options + expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(null); + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zone.info()); + replay(dns); + Zone result = zone.reload(); + assertSame(zone.dns(), result.dns()); + assertEquals(zone.info(), result.info()); + zone.reload(ZONE_FIELD_OPTIONS); // for options + } + + @Test + public void reloadByIdAndNotFoundAndNameSetAndNotFound() { + expect(dns.getZone(ZONE_ID)).andReturn(null); + expect(dns.getZone(ZONE_NAME)).andReturn(null); + // again with options + expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(null); + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(null); + replay(dns); + Zone result = zone.reload(); + assertNull(result); + // again for options + zone.reload(ZONE_FIELD_OPTIONS); + } + + @Test + public void reloadByIdAndNotFoundAndNameNotSet() { + expect(dns.getZone(ZONE_ID)).andReturn(null); + expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(null); // for options + replay(dns); + Zone result = zoneNoName.reload(); + assertNull(result); + zoneNoName.reload(ZONE_FIELD_OPTIONS); // for options + } + + @Test + public void reloadByNameAndFound() { + expect(dns.getZone(ZONE_NAME)).andReturn(zoneNoId.info()); + // again for options + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zoneNoId.info()); + replay(dns); + Zone result = zoneNoId.reload(); + assertSame(zoneNoId.dns(), result.dns()); + assertEquals(zoneNoId.info(), result.info()); + zoneNoId.reload(ZONE_FIELD_OPTIONS); // check options + } + + @Test + public void reloadByNameAndNotFound() { + expect(dns.getZone(ZONE_NAME)).andReturn(null); + // again for options + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(null); + replay(dns); + Zone result = zoneNoId.reload(); + assertNull(result); + zoneNoId.reload(ZONE_FIELD_OPTIONS); // for options + } + + @Test + public void applyChangeByIdAndFound() { + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(CHANGE_REQUEST_AFTER); + // again for options + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(CHANGE_REQUEST_AFTER); + replay(dns); + ChangeRequest result = zone.applyChangeRequest(CHANGE_REQUEST); + assertNotEquals(CHANGE_REQUEST, result); + assertEquals(CHANGE_REQUEST_AFTER, result); + // for options + result = zone.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNotEquals(CHANGE_REQUEST, result); + assertEquals(CHANGE_REQUEST_AFTER, result); + } + + @Test + public void applyChangeByIdAndNotFoundAndNameSetAndFound() { + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME)) + .andReturn(CHANGE_REQUEST_AFTER); + // again for options + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(CHANGE_REQUEST_AFTER); + replay(dns); + ChangeRequest result = zone.applyChangeRequest(CHANGE_REQUEST); + assertNotEquals(CHANGE_REQUEST, result); + assertEquals(CHANGE_REQUEST_AFTER, result); + // for options + result = zone.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNotEquals(CHANGE_REQUEST, result); + assertEquals(CHANGE_REQUEST_AFTER, result); + } + + @Test + public void applyChangeIdAndNotFoundAndNameSetAndNotFound() { + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME)).andReturn(null); + // again with options + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); + replay(dns); + ChangeRequest result = zone.applyChangeRequest(CHANGE_REQUEST); + assertNull(result); + // again for options + result = zone.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNull(result); + } + + @Test + public void applyChangeRequestByIdAndNotFoundAndNameNotSet() { + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); // for options + replay(dns); + ChangeRequest result = zoneNoName.applyChangeRequest(CHANGE_REQUEST); + assertNull(result); + // again for options + result = zoneNoName.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNull(result); + } + + @Test + public void applyChangeByNameAndFound() { + // ID is not set + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME)) + .andReturn(CHANGE_REQUEST_AFTER); + // again for options + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(CHANGE_REQUEST_AFTER); + replay(dns); + ChangeRequest result = zoneNoId.applyChangeRequest(CHANGE_REQUEST); + assertEquals(CHANGE_REQUEST_AFTER, result); + // check options + result = zoneNoId.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertEquals(CHANGE_REQUEST_AFTER, result); + } + + @Test + public void applyChangeByNameAndNotFound() { + // ID is not set + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME)).andReturn(null); + // again for options + expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); + replay(dns); + ChangeRequest result = zoneNoId.applyChangeRequest(CHANGE_REQUEST); + assertNull(result); + // check options + result = zoneNoId.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNull(result); + } + + @Test + public void applyNullChangeRequest() { + replay(dns); // no calls expected + try { + zone.applyChangeRequest(null); + fail("Cannot apply null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zone.applyChangeRequest(null, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot apply null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoId.applyChangeRequest(null); + fail("Cannot apply null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoId.applyChangeRequest(null, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot apply null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoName.applyChangeRequest(null); + fail("Cannot apply null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoName.applyChangeRequest(null, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot apply null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + } + + @Test + public void getChangeByIdAndFound() { + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(CHANGE_REQUEST_AFTER); + // again for options + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(CHANGE_REQUEST_AFTER); + replay(dns); + ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST); + assertNotEquals(CHANGE_REQUEST, result); + assertEquals(CHANGE_REQUEST_AFTER, result); + // for options + result = zone.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNotEquals(CHANGE_REQUEST, result); + assertEquals(CHANGE_REQUEST_AFTER, result); + // test no id + } + + @Test + public void getChangeByIdAndNotFoundAndNameSetAndFound() { + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME)) + .andReturn(CHANGE_REQUEST_AFTER); + // again for options + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(CHANGE_REQUEST_AFTER); + replay(dns); + ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST); + assertNotEquals(CHANGE_REQUEST, result); + assertEquals(CHANGE_REQUEST_AFTER, result); + // for options + result = zone.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNotEquals(CHANGE_REQUEST, result); + assertEquals(CHANGE_REQUEST_AFTER, result); + } + + @Test + public void getChangeIdAndNotFoundAndNameSetAndNotFound() { + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME)).andReturn(null); + // again with options + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); + replay(dns); + ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST); + assertNull(result); + // again for options + result = zone.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNull(result); + } + + @Test + public void getChangeRequestByIdAndNotFoundAndNameNotSet() { + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); // for options + replay(dns); + ChangeRequest result = zoneNoName.getChangeRequest(CHANGE_REQUEST); + assertNull(result); + // again for options + result = zoneNoName.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNull(result); + } + + @Test + public void getChangeByNameAndFound() { + // ID is not set + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME)) + .andReturn(CHANGE_REQUEST_AFTER); + // again for options + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(CHANGE_REQUEST_AFTER); + replay(dns); + ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST); + assertEquals(CHANGE_REQUEST_AFTER, result); + // check options + result = zoneNoId.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertEquals(CHANGE_REQUEST_AFTER, result); + } + + @Test + public void getChangeByNameAndNotFound() { + // ID is not set + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME)).andReturn(null); + // again for options + expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); + replay(dns); + ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST); + assertNull(result); + // check options + result = zoneNoId.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertNull(result); + } + + @Test + public void getNullChangeRequest() { + replay(dns); // no calls expected + try { + zone.getChangeRequest(null); + fail("Cannot get null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zone.getChangeRequest(null, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot get null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoId.getChangeRequest(null); + fail("Cannot get null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoId.getChangeRequest(null, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot get null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoName.getChangeRequest(null); + fail("Cannot get null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoName.getChangeRequest(null, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot get null ChangeRequest."); + } catch (NullPointerException e) { + // expected + } + } + + @Test + public void getChangeRequestWithNoId() { + replay(dns); // no calls expected + try { + zone.getChangeRequest(CHANGE_REQUEST_NO_ID); + fail("Cannot get ChangeRequest with no id."); + } catch (NullPointerException e) { + // expected + } + try { + zone.getChangeRequest(CHANGE_REQUEST_NO_ID, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot get ChangeRequest with no id."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoId.getChangeRequest(CHANGE_REQUEST_NO_ID); + fail("Cannot get ChangeRequest with no id."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoId.getChangeRequest(CHANGE_REQUEST_NO_ID, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot get ChangeRequest with no id."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoName.getChangeRequest(CHANGE_REQUEST_NO_ID); + fail("Cannot get ChangeRequest with no id."); + } catch (NullPointerException e) { + // expected + } + try { + zoneNoName.getChangeRequest(CHANGE_REQUEST_NO_ID, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot get ChangeRequest with no id."); + } catch (NullPointerException e) { + // expected + } + } + + @Test + public void listChangeRequestsByIdAndFound() { + Page pageMock = createStrictMock(Page.class); + replay(pageMock); + expect(dns.listChangeRequests(ZONE_ID)).andReturn(pageMock); + // again for options + expect(dns.listChangeRequests(ZONE_ID, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(pageMock); + replay(dns); + Page result = zone.listChangeRequests(); + assertSame(pageMock, result); + verify(pageMock); + // verify options + zone.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); + } + + @Test + public void listChangeRequestsByIdAndNotFoundAndNameSetAndFound() { + Page pageMock = createStrictMock(Page.class); + replay(pageMock); + expect(dns.listChangeRequests(ZONE_ID)).andReturn(null); + expect(dns.listChangeRequests(ZONE_NAME)).andReturn(pageMock); + // again for options + expect(dns.listChangeRequests(ZONE_ID, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); + expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)) + .andReturn(pageMock); + replay(dns); + Page result = zone.listChangeRequests(); + assertSame(pageMock, result); + verify(pageMock); + // verify options + zone.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); + } + + @Test + public void listChangeRequestsByIdAndNotFoundAndNameSetAndNotFound() { + expect(dns.listChangeRequests(ZONE_ID)).andReturn(null); + expect(dns.listChangeRequests(ZONE_NAME)).andReturn(null); + // again for options + expect(dns.listChangeRequests(ZONE_ID, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); + expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); + replay(dns); + Page result = zone.listChangeRequests(); + assertNull(result); + // check options + zone.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); + } + + @Test + public void listChangeRequestsByIdAndNotFoundAndNameNotSet() { + expect(dns.listChangeRequests(ZONE_ID)).andReturn(null); + // again for options + expect(dns.listChangeRequests(ZONE_ID, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); + replay(dns); + Page result = zoneNoName.listChangeRequests(); + assertNull(result); + zoneNoName.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); // check options + } + + @Test + public void listChangeRequestsByNameAndFound() { + Page pageMock = createStrictMock(Page.class); + replay(pageMock); + expect(dns.listChangeRequests(ZONE_NAME)).andReturn(pageMock); + // again for options + expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)) + .andReturn(pageMock); + replay(dns); + Page result = zoneNoId.listChangeRequests(); + assertSame(pageMock, result); + verify(pageMock); + zoneNoId.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); // check options + } + + @Test + public void listChangeRequestsByNameAndNotFound() { + expect(dns.listChangeRequests(ZONE_NAME)).andReturn(null); + // again for options + expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); + replay(dns); + Page result = zoneNoId.listChangeRequests(); + assertNull(result); + zoneNoId.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); // check options + } +} From e083dfd87052a3231067cf0b0535e899d279d5c3 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Tue, 2 Feb 2016 12:39:08 -0800 Subject: [PATCH 35/50] Fixed documentation and some code formatting. Declared exceptions to be thrown when parent objects do not exist. Changed contracts of applyChangeRequest and getChangeRequest methods. Adjusted tests. --- .../main/java/com/google/gcloud/dns/Dns.java | 147 +++++++++--------- .../main/java/com/google/gcloud/dns/Zone.java | 92 +++++------ .../java/com/google/gcloud/dns/DnsTest.java | 2 +- .../java/com/google/gcloud/dns/ZoneTest.java | 112 ++++++------- 4 files changed, 171 insertions(+), 182 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index b48e4b0a90f2..130e8bb99f5e 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -37,7 +37,7 @@ public interface Dns extends Service { * The fields of a project. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code Dns#getProjectInfo(ProjectGetOption...)}. Project ID is always returned, even if not + * {@link Dns#getProjectInfo(ProjectOption...)}. Project ID is always returned, even if not * specified. */ enum ProjectField { @@ -69,7 +69,7 @@ static String selector(ProjectField... fields) { * The fields of a zone. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code Dns#getZone(BigInteger, ZoneOption...)} or {@code Dns#getZone(String, ZoneOption...)}. + * {@link Dns#getZone(BigInteger, ZoneOption...)} or {@link Dns#getZone(String, ZoneOption...)}. * The ID is always returned, even if not specified. */ enum ZoneField { @@ -105,7 +105,7 @@ static String selector(ZoneField... fields) { * The fields of a DNS record. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code Dns#listDnsRecords(BigInteger, DnsRecordListOption...)} or {@code + * {@link Dns#listDnsRecords(BigInteger, DnsRecordListOption...)} or {@link * Dns#listDnsRecords(String, DnsRecordListOption...)}. The name is always returned even if not * selected. */ @@ -139,8 +139,8 @@ static String selector(DnsRecordField... fields) { * The fields of a change request. * *

These values can be used to specify the fields to include in a partial response when calling - * {@code Dns#applyChangeRequest(ChangeRequest, BigInteger, ChangeRequestOption...)} or {@code - * Dns#applyChangeRequest(ChangeRequest, String, ChangeRequestOption...)} The ID is always + * {@link Dns#applyChangeRequest(BigInteger, ChangeRequest, ChangeRequestOption...)} or {@link + * Dns#applyChangeRequest(String, ChangeRequest, ChangeRequestOption...)} The ID is always * returned even if not selected. */ enum ChangeRequestField { @@ -313,11 +313,11 @@ public static ZoneListOption pageSize(int pageSize) { /** * Class for specifying project options. */ - class ProjectGetOption extends AbstractOption implements Serializable { + class ProjectOption extends AbstractOption implements Serializable { private static final long serialVersionUID = 6817937338218847748L; - ProjectGetOption(DnsRpc.Option option, Object value) { + ProjectOption(DnsRpc.Option option, Object value) { super(option, value); } @@ -325,12 +325,12 @@ class ProjectGetOption extends AbstractOption implements Serializable { * Returns an option to specify the project's fields to be returned by the RPC call. * *

If this option is not provided all project fields are returned. {@code - * ProjectGetOption.fields} can be used to specify only the fields of interest. Project ID is + * ProjectOption.fields} can be used to specify only the fields of interest. Project ID is * always returned, even if not specified. {@link ProjectField} provides a list of fields that * can be used. */ - public static ProjectGetOption fields(ProjectField... fields) { - return new ProjectGetOption(DnsRpc.Option.FIELDS, ProjectField.selector(fields)); + public static ProjectOption fields(ProjectField... fields) { + return new ProjectOption(DnsRpc.Option.FIELDS, ProjectField.selector(fields)); } } @@ -423,10 +423,11 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { /** * Creates a new zone. * - * @return ZoneInfo object representing the new zone's metadata. In addition to the name, dns name - * and description (supplied by the user within the {@code zoneInfo} parameter, the returned - * object will include the following read-only fields supplied by the server: creation time, id, - * and list of name servers. + *

Returns {@link ZoneInfo} object representing the new zone's information. In addition to the + * name, dns name and description (supplied by the user within the {@code zoneInfo} parameter), + * the returned object will include the following read-only fields supplied by the server: + * creation time, id, and list of name servers. + * * @throws DnsException upon failure * @see Cloud DNS Managed Zones: * create @@ -434,8 +435,8 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { ZoneInfo create(ZoneInfo zoneInfo); /** - * Retrieves the zone by the specified zone name. Returns {@code null} is the zone is not found. - * The returned fields can be optionally restricted by specifying {@code ZoneFieldOptions}. + * Returns the zone by the specified zone name. Returns {@code null} if the zone is not found. The + * returned fields can be optionally restricted by specifying {@link ZoneOption}s. * * @throws DnsException upon failure * @see Cloud DNS Managed Zones: @@ -444,8 +445,8 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { ZoneInfo getZone(String zoneName, ZoneOption... options); /** - * Retrieves the zone by the specified zone name. Returns {@code null} is the zone is not found. - * The returned fields can be optionally restricted by specifying {@code ZoneFieldOptions}. + * Returns the zone by the specified zone id. Returns {@code null} if the zone is not found. The + * returned fields can be optionally restricted by specifying {@link ZoneOption}s. * * @throws DnsException upon failure * @see Cloud DNS Managed Zones: @@ -454,13 +455,13 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { ZoneInfo getZone(BigInteger zoneId, ZoneOption... options); /** - * Lists the zoned inside the project. + * Lists the zones inside the project. * - *

This method returns zone in an unspecified order. New zones do not necessarily appear at the - * end of the list. Use {@link ZoneListOption} to restrict the listing to a domain name, set page - * size, and set page tokens. + *

This method returns zones in an unspecified order. New zones do not necessarily appear at + * the end of the list. Use {@link ZoneListOption} to restrict the listing to a domain name, set + * page size, and set page token. * - * @return {@code Page}, a page of zones + * @return a page of zones * @throws DnsException upon failure * @see Cloud DNS Managed Zones: * list @@ -468,10 +469,10 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { Page listZones(ZoneListOption... options); /** - * Deletes an existing zone identified by name. Returns true if the zone was successfully deleted - * and false otherwise. + * Deletes an existing zone identified by name. Returns {@code true} if the zone was successfully + * deleted and {@code false} otherwise. * - * @return {@code true} if zone was found and deleted and false otherwise + * @return {@code true} if zone was found and deleted and {@code false} otherwise * @throws DnsException upon failure * @see Cloud DNS Managed Zones: * delete @@ -479,10 +480,10 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { boolean delete(String zoneName); // delete does not admit any options /** - * Deletes an existing zone identified by id. Returns true if the zone was successfully deleted - * and false otherwise. + * Deletes an existing zone identified by id. Returns {@code true} if the zone was successfully + * deleted and {@code false} otherwise. * - * @return {@code true} if zone was found and deleted and false otherwise + * @return {@code true} if zone was found and deleted and {@code false} otherwise * @throws DnsException upon failure * @see Cloud DNS Managed Zones: * delete @@ -492,10 +493,10 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { /** * Lists the DNS records in the zone identified by name. * - *

The fields to be returned, page size and page tokens can be specified using {@code - * DnsRecordOptions}. Returns null if the zone cannot be found. + *

The fields to be returned, page size and page tokens can be specified using {@link + * DnsRecordListOption}s. * - * @throws DnsException upon failure + * @throws DnsException upon failure or if the zone cannot be found * @see Cloud DNS * ResourceRecordSets: list */ @@ -504,23 +505,23 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { /** * Lists the DNS records in the zone identified by ID. * - *

The fields to be returned, page size and page tokens can be specified using {@code - * DnsRecordOptions}. Returns null if the zone cannot be found. + *

The fields to be returned, page size and page tokens can be specified using {@link + * DnsRecordListOption}s. * - * @throws DnsException upon failure + * @throws DnsException upon failure or if the zone cannot be found * @see Cloud DNS * ResourceRecordSets: list */ Page listDnsRecords(BigInteger zoneId, DnsRecordListOption... options); /** - * Retrieves the metadata about the current project. The returned fields can be optionally - * restricted by specifying {@code ProjectOptions}. + * Retrieves the information about the current project. The returned fields can be optionally + * restricted by specifying {@link ProjectOption}s. * * @throws DnsException upon failure * @see Cloud DNS Projects: get */ - ProjectInfo getProjectInfo(ProjectGetOption... fields); + ProjectInfo getProjectInfo(ProjectOption... fields); /** * Returns the current project id. @@ -533,64 +534,61 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { BigInteger getProjectNumber(); /** - * Submits a change requests for applying to the zone identified by ID to the service. The - * returned object contains the following read-only fields supplied by the server: id, start time - * and status. time, id, and list of name servers. The returned fields can be modified by {@code - * ChangeRequestFieldOptions}. Returns null if the zone is not found. + * Submits a change request for the specified zone. The returned object contains the following + * read-only fields supplied by the server: id, start time and status. time, id, and list of name + * servers. The fields to be returned can be selected by {@link ChangeRequestOption}s. * - * @return ChangeRequest object representing the new change request or null if zone is not found + * @return the new {@link ChangeRequest} or {@code null} if zone is not found * @throws DnsException upon failure * @see Cloud DNS Changes: create */ - ChangeRequest applyChangeRequest(ChangeRequest changeRequest, BigInteger zoneId, - ChangeRequestOption... options); + ChangeRequest applyChangeRequest(BigInteger zoneId, ChangeRequest changeRequest, + ChangeRequestOption... options); /** - * Submits a change requests for applying to the zone identified by name to the service. The - * returned object contains the following read-only fields supplied by the server: id, start time - * and status. time, id, and list of name servers. The returned fields can be modified by {@code - * ChangeRequestFieldOptions}. Returns null if the zone is not found. + * Submits a change request for the specified zone. The returned object contains the following + * read-only fields supplied by the server: id, start time and status. time, id, and list of name + * servers. The fields to be returned can be selected by {@link ChangeRequestOption}s. * - * @return ChangeRequest object representing the new change request or null if zone is not found - * @throws DnsException upon failure + * @return the new {@link ChangeRequest} + * @throws DnsException upon failure if zone is not found * @see Cloud DNS Changes: create */ - ChangeRequest applyChangeRequest(ChangeRequest changeRequest, String zoneName, - ChangeRequestOption... options); + ChangeRequest applyChangeRequest(String zoneName, ChangeRequest changeRequest, + ChangeRequestOption... options); /** * Retrieves updated information about a change request previously submitted for a zone identified - * by ID. Returns null if the zone or request cannot be found. - * - *

The fields to be returned using {@code ChangeRequestFieldOptions}. + * by ID. Returns {@code null} if the request cannot be found and throws an exception if the zone + * does not exist. The fields to be returned using can be specified using {@link + * ChangeRequestOption}s. * - * @throws DnsException upon failure + * @throws DnsException upon failure or if the zone cannot be found * @see Cloud DNS Chages: get */ - ChangeRequest getChangeRequest(ChangeRequest changeRequest, BigInteger zoneId, - ChangeRequestOption... options); + ChangeRequest getChangeRequest(String changeRequestId, BigInteger zoneId, + ChangeRequestOption... options); /** * Retrieves updated information about a change request previously submitted for a zone identified - * by name. Returns null if the zone or request cannot be found. - * - *

The fields to be returned using {@code ChangeRequestFieldOptions}. + * by ID. Returns {@code null} if the request cannot be found and throws an exception if the zone + * does not exist. The fields to be returned using can be specified using {@link + * ChangeRequestOption}s. * - * @throws DnsException upon failure + * @throws DnsException upon failure or if the zone cannot be found * @see Cloud DNS Chages: get */ - ChangeRequest getChangeRequest(ChangeRequest changeRequest, String zoneName, - ChangeRequestOption... options); + ChangeRequest getChangeRequest(String changeRequestId, String zoneName, + ChangeRequestOption... options); /** * Lists the change requests for the zone identified by ID that were submitted to the service. * - *

The sorting key for changes, fields to be returned, page and page tokens can be specified - * using {@code ChangeRequestListOptions}. Note that the only sorting key currently supported is - * the timestamp of submitting the change request to the service. + *

The sorting order for changes (based on when they were received by the server), fields to be + * returned, page size and page token can be specified using {@link ChangeRequestListOption}s. * - * @return {@code Page}, a page of change requests - * @throws DnsException upon failure + * @return A page of change requests + * @throws DnsException upon failure or if the zone cannot be found * @see Cloud DNS Chages: list */ Page listChangeRequests(BigInteger zoneId, ChangeRequestListOption... options); @@ -598,12 +596,11 @@ ChangeRequest getChangeRequest(ChangeRequest changeRequest, String zoneName, /** * Lists the change requests for the zone identified by name that were submitted to the service. * - *

The sorting key for changes, fields to be returned, page and page tokens can be specified - * using {@code ChangeRequestListOptions}. Note that the only sorting key currently supported is - * the timestamp of submitting the change request to the service. + *

The sorting order for changes (based on when they were received by the server), fields to be + * returned, page size and page token can be specified using {@link ChangeRequestListOption}s. * - * @return {@code Page}, a page of change requests - * @throws DnsException upon failure + * @return A page of change requests + * @throws DnsException upon failure or if the zone cannot be found * @see Cloud DNS Chages: list */ Page listChangeRequests(String zoneName, ChangeRequestListOption... options); diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java index f4d9702ba12f..dc0be8b94b44 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -16,6 +16,7 @@ package com.google.gcloud.dns; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import com.google.gcloud.Page; @@ -52,15 +53,14 @@ public Zone(Dns dns, ZoneInfo zoneInfo) { /** * Constructs a {@code Zone} object that contains meta information received from the Google Cloud - * DNS service for the provided zoneName. + * DNS service for the provided {@code zoneName}. * - * @param zoneName Name of the zone to be searched for - * @param options Optional restriction on what fields should be returned by the service - * @return Zone object containing metadata or null if not not found + * @param zoneName name of the zone to be searched for + * @param options optional restriction on what fields should be returned by the service + * @return zone object containing metadata or {@code null} if not not found * @throws DnsException upon failure */ - public static Zone get(Dns dnsService, String zoneName, - Dns.ZoneOption... options) { + public static Zone get(Dns dnsService, String zoneName, Dns.ZoneOption... options) { checkNotNull(zoneName); checkNotNull(dnsService); ZoneInfo zoneInfo = dnsService.getZone(zoneName, options); @@ -68,16 +68,15 @@ public static Zone get(Dns dnsService, String zoneName, } /** - * Constructs a {@code Zone} object that contains meta information received from the Google Cloud - * DNS service for the provided zoneName. + * Constructs a {@code Zone} object that contains information received from the Google Cloud DNS + * service for the provided {@code zoneId}. * * @param zoneId ID of the zone to be searched for - * @param options Optional restriction on what fields should be returned by the service - * @return Zone object containing metadata or null if not not found + * @param options optional restriction on what fields should be returned by the service + * @return zone object containing zone's information or {@code null} if not not found * @throws DnsException upon failure */ - public static Zone get(Dns dnsService, BigInteger zoneId, - Dns.ZoneOption... options) { + public static Zone get(Dns dnsService, BigInteger zoneId, Dns.ZoneOption... options) { checkNotNull(zoneId); checkNotNull(dnsService); ZoneInfo zoneInfo = dnsService.getZone(zoneId, options); @@ -88,8 +87,8 @@ public static Zone get(Dns dnsService, BigInteger zoneId, * Retrieves the latest information about the zone. The method first attempts to retrieve the zone * by ID and if not set or zone is not found, it searches by name. * - * @param options Optional restriction on what fields should be fetched - * @return Zone object containing updated metadata or null if not not found + * @param options optional restriction on what fields should be fetched + * @return zone object containing updated information or {@code null} if not not found * @throws DnsException upon failure * @throws NullPointerException if both zone ID and name are not initialized */ @@ -110,7 +109,7 @@ public Zone reload(Dns.ZoneOption... options) { * Deletes the zone. The method first attempts to delete the zone by ID. If the zone is not found * or id is not set, it attempts to delete by name. * - * @return true is zone was found and deleted and false otherwise + * @return {@code true} is zone was found and deleted and {@code false} otherwise * @throws DnsException upon failure * @throws NullPointerException if both zone ID and name are not initialized */ @@ -131,10 +130,10 @@ public boolean delete() { * Lists all {@link DnsRecord}s associated with this zone. First searches for zone by ID and if * not found then by name. * - * @param options Optional restriction on listing and on what fields of {@link DnsRecord} should + * @param options optional restriction on listing and on what fields of {@link DnsRecord} should * be returned by the service - * @return {@code Page}, a page of DNS records, or null if the zone is not found - * @throws DnsException upon failure + * @return a page of DNS records + * @throws DnsException upon failure or if the zone is not found * @throws NullPointerException if both zone ID and name are not initialized */ public Page listDnsRecords(Dns.DnsRecordListOption... options) { @@ -153,25 +152,24 @@ public Page listDnsRecords(Dns.DnsRecordListOption... options) { /** * Submits {@link ChangeRequest} to the service for it to applied to this zone. First searches for * the zone by ID and if not found then by name. Returns a {@link ChangeRequest} with - * server-assigned ID or null if the zone was not found. + * server-assigned ID or {@code null} if the zone was not found. * - * @param options Optional restriction on what fields of {@link ChangeRequest} should be returned - * by the service - * @return ChangeRequest with server-assigned ID or null if the zone was not found. - * @throws DnsException upon failure + * @param options optional restriction on what fields of {@link ChangeRequest} should be returned + * @return ChangeRequest with server-assigned ID + * @throws DnsException upon failure or if the zone is not found * @throws NullPointerException if both zone ID and name are not initialized */ public ChangeRequest applyChangeRequest(ChangeRequest changeRequest, - Dns.ChangeRequestOption... options) { + Dns.ChangeRequestOption... options) { checkNameOrIdNotNull(); checkNotNull(changeRequest); ChangeRequest updated = null; if (zoneInfo.id() != null) { - updated = dns.applyChangeRequest(changeRequest, zoneInfo.id(), options); + updated = dns.applyChangeRequest(zoneInfo.id(), changeRequest, options); } if (updated == null && zoneInfo.name() != null) { // zone was not found by id or id is not set at all - updated = dns.applyChangeRequest(changeRequest, zoneInfo.name(), options); + updated = dns.applyChangeRequest(zoneInfo.name(), changeRequest, options); } return updated; } @@ -179,41 +177,38 @@ public ChangeRequest applyChangeRequest(ChangeRequest changeRequest, /** * Retrieves an updated information about a change request previously submitted to be applied to * this zone. First searches for the zone by ID and if not found then by name. Returns a {@link - * ChangeRequest} if found and null is the zone or the change request was not found. + * ChangeRequest} if found and {@code null} is the zone or the change request was not found. * - * @param options Optional restriction on what fields of {@link ChangeRequest} should be returned - * by the service - * @return ChangeRequest with updated information of null if the change request or zone was not - * found. - * @throws DnsException upon failure + * @param options optional restriction on what fields of {@link ChangeRequest} should be returned + * @return updated ChangeRequest + * @throws DnsException upon failure or if the zone is not found * @throws NullPointerException if both zone ID and name are not initialized * @throws NullPointerException if the change request does not have initialized id */ - public ChangeRequest getChangeRequest(ChangeRequest changeRequest, - Dns.ChangeRequestOption... options) { + public ChangeRequest getChangeRequest(String changeRequestId, + Dns.ChangeRequestOption... options) { checkNameOrIdNotNull(); - checkNotNull(changeRequest); - checkNotNull(changeRequest.id()); + checkNotNull(changeRequestId); ChangeRequest updated = null; if (zoneInfo.id() != null) { - updated = dns.getChangeRequest(changeRequest, zoneInfo.id(), options); + updated = dns.getChangeRequest(changeRequestId, zoneInfo.id(), options); } if (updated == null && zoneInfo.name() != null) { // zone was not found by id or id is not set at all - updated = dns.getChangeRequest(changeRequest, zoneInfo.name(), options); + updated = dns.getChangeRequest(changeRequestId, zoneInfo.name(), options); } return updated; } /** * Retrieves all change requests for this zone. First searches for the zone by ID and if not found - * then by name. Returns a page of {@link ChangeRequest}s or null if the zone is not found. + * then by name. Returns a page of {@link ChangeRequest}s or {@code null} if the zone is not + * found. * - * @param options Optional restriction on listing and on what fields of {@link ChangeRequest}s + * @param options optional restriction on listing and on what fields of {@link ChangeRequest}s * should be returned by the service - * @return {@code Page}, a page of change requests, or null if the zone is not - * found - * @throws DnsException upon failure + * @return a page of change requests + * @throws DnsException upon failure or if the zone is not found * @throws NullPointerException if both zone ID and name are not initialized */ public Page listChangeRequests(Dns.ChangeRequestListOption... options) { @@ -233,24 +228,21 @@ public Page listChangeRequests(Dns.ChangeRequestListOption... opt * Check that at least one of name and ID are initialized and throw and exception if not. */ private void checkNameOrIdNotNull() { - if (zoneInfo != null && zoneInfo.id() == null && zoneInfo.name() == null) { - throw new NullPointerException("Both zoneInfo.id and zoneInfo.name are null. " - + "This is an inconsistent state which should never happen."); - } + checkArgument(zoneInfo != null && (zoneInfo.id() != null || zoneInfo.name() != null), + "Both zoneInfo.id and zoneInfo.name are null. This is should never happen."); } /** - * Returns the {@link ZoneInfo} object containing meta information about this managed zone. + * Returns the {@link ZoneInfo} object containing information about this zone. */ public ZoneInfo info() { return this.zoneInfo; } /** - * Returns the {@link Dns} service object associated with this managed zone. + * Returns the {@link Dns} service object associated with this zone. */ public Dns dns() { return this.dns; } - } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java index 2e98dbd46de4..a60cae1d1793 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java @@ -94,7 +94,7 @@ public void testZoneList() { @Test public void testProjectGetOption() { // fields - Dns.ProjectGetOption fields = Dns.ProjectGetOption.fields(Dns.ProjectField.QUOTA); + Dns.ProjectOption fields = Dns.ProjectOption.fields(Dns.ProjectField.QUOTA); assertEquals(DnsRpc.Option.FIELDS, fields.rpcOption()); assertTrue(fields.value() instanceof String); assertTrue(((String) fields.value()).contains(Dns.ProjectField.QUOTA.selector())); diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java index 5f9d119e6150..a87bb969855b 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java @@ -348,9 +348,9 @@ public void reloadByNameAndNotFound() { @Test public void applyChangeByIdAndFound() { - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(CHANGE_REQUEST_AFTER); + expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST)).andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); ChangeRequest result = zone.applyChangeRequest(CHANGE_REQUEST); @@ -364,13 +364,13 @@ public void applyChangeByIdAndFound() { @Test public void applyChangeByIdAndNotFoundAndNameSetAndFound() { - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME)) + expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST)).andReturn(null); + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)) .andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); ChangeRequest result = zone.applyChangeRequest(CHANGE_REQUEST); @@ -384,12 +384,12 @@ public void applyChangeByIdAndNotFoundAndNameSetAndFound() { @Test public void applyChangeIdAndNotFoundAndNameSetAndNotFound() { - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME)).andReturn(null); + expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST)).andReturn(null); + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)).andReturn(null); // again with options - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); replay(dns); ChangeRequest result = zone.applyChangeRequest(CHANGE_REQUEST); @@ -401,8 +401,8 @@ public void applyChangeIdAndNotFoundAndNameSetAndNotFound() { @Test public void applyChangeRequestByIdAndNotFoundAndNameNotSet() { - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST)).andReturn(null); + expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); // for options replay(dns); ChangeRequest result = zoneNoName.applyChangeRequest(CHANGE_REQUEST); @@ -415,10 +415,10 @@ public void applyChangeRequestByIdAndNotFoundAndNameNotSet() { @Test public void applyChangeByNameAndFound() { // ID is not set - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME)) + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)) .andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); ChangeRequest result = zoneNoId.applyChangeRequest(CHANGE_REQUEST); @@ -431,9 +431,9 @@ public void applyChangeByNameAndFound() { @Test public void applyChangeByNameAndNotFound() { // ID is not set - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME)).andReturn(null); + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)).andReturn(null); // again for options - expect(dns.applyChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); replay(dns); ChangeRequest result = zoneNoId.applyChangeRequest(CHANGE_REQUEST); @@ -486,16 +486,16 @@ public void applyNullChangeRequest() { @Test public void getChangeByIdAndFound() { - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(CHANGE_REQUEST_AFTER); + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID)).andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); - ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST); + ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); assertNotEquals(CHANGE_REQUEST, result); assertEquals(CHANGE_REQUEST_AFTER, result); // for options - result = zone.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + result = zone.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); assertNotEquals(CHANGE_REQUEST, result); assertEquals(CHANGE_REQUEST_AFTER, result); // test no id @@ -503,82 +503,82 @@ public void getChangeByIdAndFound() { @Test public void getChangeByIdAndNotFoundAndNameSetAndFound() { - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID)).andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME)) .andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); - ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST); + ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); assertNotEquals(CHANGE_REQUEST, result); assertEquals(CHANGE_REQUEST_AFTER, result); // for options - result = zone.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + result = zone.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); assertNotEquals(CHANGE_REQUEST, result); assertEquals(CHANGE_REQUEST_AFTER, result); } @Test public void getChangeIdAndNotFoundAndNameSetAndNotFound() { - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME)).andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID)).andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME)).andReturn(null); // again with options - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); replay(dns); - ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST); + ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); assertNull(result); // again for options - result = zone.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + result = zone.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); assertNull(result); } @Test public void getChangeRequestByIdAndNotFoundAndNameNotSet() { - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID)).andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID)).andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); // for options replay(dns); - ChangeRequest result = zoneNoName.getChangeRequest(CHANGE_REQUEST); + ChangeRequest result = zoneNoName.getChangeRequest(CHANGE_REQUEST.id()); assertNull(result); // again for options - result = zoneNoName.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + result = zoneNoName.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); assertNull(result); } @Test public void getChangeByNameAndFound() { // ID is not set - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME)) .andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); - ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST); + ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); assertEquals(CHANGE_REQUEST_AFTER, result); // check options - result = zoneNoId.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); assertEquals(CHANGE_REQUEST_AFTER, result); } @Test public void getChangeByNameAndNotFound() { // ID is not set - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME)).andReturn(null); + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME)).andReturn(null); // again for options - expect(dns.getChangeRequest(CHANGE_REQUEST, ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); replay(dns); - ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST); + ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); assertNull(result); // check options - result = zoneNoId.getChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); assertNull(result); } @@ -627,38 +627,38 @@ public void getNullChangeRequest() { public void getChangeRequestWithNoId() { replay(dns); // no calls expected try { - zone.getChangeRequest(CHANGE_REQUEST_NO_ID); - fail("Cannot get ChangeRequest with no id."); + zone.getChangeRequest(CHANGE_REQUEST_NO_ID.id()); + fail("Cannot get ChangeRequest by null id."); } catch (NullPointerException e) { // expected } try { - zone.getChangeRequest(CHANGE_REQUEST_NO_ID, CHANGE_REQUEST_FIELD_OPTIONS); - fail("Cannot get ChangeRequest with no id."); + zone.getChangeRequest(CHANGE_REQUEST_NO_ID.id(), CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot get ChangeRequest by null id."); } catch (NullPointerException e) { // expected } try { - zoneNoId.getChangeRequest(CHANGE_REQUEST_NO_ID); - fail("Cannot get ChangeRequest with no id."); + zoneNoId.getChangeRequest(CHANGE_REQUEST_NO_ID.id()); + fail("Cannot get ChangeRequest by null id."); } catch (NullPointerException e) { // expected } try { - zoneNoId.getChangeRequest(CHANGE_REQUEST_NO_ID, CHANGE_REQUEST_FIELD_OPTIONS); - fail("Cannot get ChangeRequest with no id."); + zoneNoId.getChangeRequest(CHANGE_REQUEST_NO_ID.id(), CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot get ChangeRequest by null id."); } catch (NullPointerException e) { // expected } try { - zoneNoName.getChangeRequest(CHANGE_REQUEST_NO_ID); - fail("Cannot get ChangeRequest with no id."); + zoneNoName.getChangeRequest(CHANGE_REQUEST_NO_ID.id()); + fail("Cannot get ChangeRequest by null id."); } catch (NullPointerException e) { // expected } try { - zoneNoName.getChangeRequest(CHANGE_REQUEST_NO_ID, CHANGE_REQUEST_FIELD_OPTIONS); - fail("Cannot get ChangeRequest with no id."); + zoneNoName.getChangeRequest(CHANGE_REQUEST_NO_ID.id(), CHANGE_REQUEST_FIELD_OPTIONS); + fail("Cannot get ChangeRequest by null id."); } catch (NullPointerException e) { // expected } From d6daf0956ff0975bed3115f9b09a1381bc1cf137 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Tue, 2 Feb 2016 16:17:31 -0800 Subject: [PATCH 36/50] Adjusted documentation, removed getProjectId and getProjectNumber --- .../main/java/com/google/gcloud/dns/Dns.java | 14 +---- .../main/java/com/google/gcloud/dns/Zone.java | 12 ++-- .../java/com/google/gcloud/dns/ZoneTest.java | 56 ++++++++++--------- 3 files changed, 37 insertions(+), 45 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 130e8bb99f5e..644814fa201b 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -523,16 +523,6 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { */ ProjectInfo getProjectInfo(ProjectOption... fields); - /** - * Returns the current project id. - */ - String getProjectId(); - - /** - * Returns the current project number. - */ - BigInteger getProjectNumber(); - /** * Submits a change request for the specified zone. The returned object contains the following * read-only fields supplied by the server: id, start time and status. time, id, and list of name @@ -566,7 +556,7 @@ ChangeRequest applyChangeRequest(String zoneName, ChangeRequest changeRequest, * @throws DnsException upon failure or if the zone cannot be found * @see Cloud DNS Chages: get */ - ChangeRequest getChangeRequest(String changeRequestId, BigInteger zoneId, + ChangeRequest getChangeRequest(BigInteger zoneId, String changeRequestId, ChangeRequestOption... options); /** @@ -578,7 +568,7 @@ ChangeRequest getChangeRequest(String changeRequestId, BigInteger zoneId, * @throws DnsException upon failure or if the zone cannot be found * @see Cloud DNS Chages: get */ - ChangeRequest getChangeRequest(String changeRequestId, String zoneName, + ChangeRequest getChangeRequest(String zoneName, String changeRequestId, ChangeRequestOption... options); /** diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java index dc0be8b94b44..86fc86bc3688 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -130,8 +130,7 @@ public boolean delete() { * Lists all {@link DnsRecord}s associated with this zone. First searches for zone by ID and if * not found then by name. * - * @param options optional restriction on listing and on what fields of {@link DnsRecord} should - * be returned by the service + * @param options optional restriction on listing and fields of {@link DnsRecord}s returned * @return a page of DNS records * @throws DnsException upon failure or if the zone is not found * @throws NullPointerException if both zone ID and name are not initialized @@ -191,11 +190,11 @@ public ChangeRequest getChangeRequest(String changeRequestId, checkNotNull(changeRequestId); ChangeRequest updated = null; if (zoneInfo.id() != null) { - updated = dns.getChangeRequest(changeRequestId, zoneInfo.id(), options); + updated = dns.getChangeRequest(zoneInfo.id(), changeRequestId, options); } if (updated == null && zoneInfo.name() != null) { // zone was not found by id or id is not set at all - updated = dns.getChangeRequest(changeRequestId, zoneInfo.name(), options); + updated = dns.getChangeRequest(zoneInfo.name(), changeRequestId, options); } return updated; } @@ -205,8 +204,7 @@ public ChangeRequest getChangeRequest(String changeRequestId, * then by name. Returns a page of {@link ChangeRequest}s or {@code null} if the zone is not * found. * - * @param options optional restriction on listing and on what fields of {@link ChangeRequest}s - * should be returned by the service + * @param options optional restriction on listing and fields to be returned * @return a page of change requests * @throws DnsException upon failure or if the zone is not found * @throws NullPointerException if both zone ID and name are not initialized @@ -236,7 +234,7 @@ private void checkNameOrIdNotNull() { * Returns the {@link ZoneInfo} object containing information about this zone. */ public ZoneInfo info() { - return this.zoneInfo; + return zoneInfo; } /** diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java index a87bb969855b..c746140ce599 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java @@ -101,16 +101,15 @@ public void testGetById() { Zone retrieved = Zone.get(dns, ZONE_ID); assertSame(dns, retrieved.dns()); assertEquals(ZONE_INFO, retrieved.info()); - BigInteger id = null; try { - Zone.get(dns, id); - fail("Cannot get null zone."); + Zone.get(dns, (BigInteger) null); + fail("Cannot get by null id."); } catch (NullPointerException e) { // expected } try { - Zone.get(null, id); - fail("Cannot get null zone."); + Zone.get(null, new BigInteger("12")); + fail("Cannot get anything from null service."); } catch (NullPointerException e) { // expected } @@ -126,16 +125,15 @@ public void testGetByName() { Zone retrieved = Zone.get(dns, ZONE_NAME); assertSame(dns, retrieved.dns()); assertEquals(ZONE_INFO, retrieved.info()); - String name = null; try { - Zone.get(dns, name); - fail("Cannot get null zone."); + Zone.get(dns, (String) null); + fail("Cannot get by null name."); } catch (NullPointerException e) { // expected } try { - Zone.get(null, name); - fail("Cannot get null zone."); + Zone.get(null, "Not null"); + fail("Cannot get anything from null service."); } catch (NullPointerException e) { // expected } @@ -195,6 +193,7 @@ public void deleteByNameAndNotFound() { @Test public void listDnsRecordsByIdAndFound() { + @SuppressWarnings("unchecked") Page pageMock = createStrictMock(Page.class); replay(pageMock); expect(dns.listDnsRecords(ZONE_ID)).andReturn(pageMock); @@ -210,6 +209,7 @@ public void listDnsRecordsByIdAndFound() { @Test public void listDnsRecordsByIdAndNotFoundAndNameSetAndFound() { + @SuppressWarnings("unchecked") Page pageMock = createStrictMock(Page.class); replay(pageMock); expect(dns.listDnsRecords(ZONE_ID)).andReturn(null); @@ -251,6 +251,7 @@ public void listDnsRecordsByIdAndNotFoundAndNameNotSet() { @Test public void listDnsRecordsByNameAndFound() { + @SuppressWarnings("unchecked") Page pageMock = createStrictMock(Page.class); replay(pageMock); expect(dns.listDnsRecords(ZONE_NAME)).andReturn(pageMock); @@ -486,9 +487,9 @@ public void applyNullChangeRequest() { @Test public void getChangeByIdAndFound() { - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID)).andReturn(CHANGE_REQUEST_AFTER); + expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id())).andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); @@ -503,13 +504,13 @@ public void getChangeByIdAndFound() { @Test public void getChangeByIdAndNotFoundAndNameSetAndFound() { - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID)).andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME)) + expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id())).andReturn(null); + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())) .andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); @@ -523,12 +524,12 @@ public void getChangeByIdAndNotFoundAndNameSetAndFound() { @Test public void getChangeIdAndNotFoundAndNameSetAndNotFound() { - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID)).andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME)).andReturn(null); + expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id())).andReturn(null); + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())).andReturn(null); // again with options - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); replay(dns); ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); @@ -540,8 +541,8 @@ public void getChangeIdAndNotFoundAndNameSetAndNotFound() { @Test public void getChangeRequestByIdAndNotFoundAndNameNotSet() { - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID)).andReturn(null); - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_ID, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id())).andReturn(null); + expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); // for options replay(dns); ChangeRequest result = zoneNoName.getChangeRequest(CHANGE_REQUEST.id()); @@ -554,10 +555,10 @@ public void getChangeRequestByIdAndNotFoundAndNameNotSet() { @Test public void getChangeByNameAndFound() { // ID is not set - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME)) + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())) .andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); @@ -570,9 +571,9 @@ public void getChangeByNameAndFound() { @Test public void getChangeByNameAndNotFound() { // ID is not set - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME)).andReturn(null); + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())).andReturn(null); // again for options - expect(dns.getChangeRequest(CHANGE_REQUEST.id(), ZONE_NAME, CHANGE_REQUEST_FIELD_OPTIONS)) + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); replay(dns); ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); @@ -666,6 +667,7 @@ public void getChangeRequestWithNoId() { @Test public void listChangeRequestsByIdAndFound() { + @SuppressWarnings("unchecked") Page pageMock = createStrictMock(Page.class); replay(pageMock); expect(dns.listChangeRequests(ZONE_ID)).andReturn(pageMock); @@ -681,6 +683,7 @@ public void listChangeRequestsByIdAndFound() { @Test public void listChangeRequestsByIdAndNotFoundAndNameSetAndFound() { + @SuppressWarnings("unchecked") Page pageMock = createStrictMock(Page.class); replay(pageMock); expect(dns.listChangeRequests(ZONE_ID)).andReturn(null); @@ -724,6 +727,7 @@ public void listChangeRequestsByIdAndNotFoundAndNameNotSet() { @Test public void listChangeRequestsByNameAndFound() { + @SuppressWarnings("unchecked") Page pageMock = createStrictMock(Page.class); replay(pageMock); expect(dns.listChangeRequests(ZONE_NAME)).andReturn(pageMock); From 0338ead2661b9099da81adb11ebb6e18553ef2e4 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Wed, 3 Feb 2016 09:01:39 -0800 Subject: [PATCH 37/50] Completes DnsRpc interface by adding methods and doc. Closes #594. --- .../java/com/google/gcloud/spi/DnsRpc.java | 117 +++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java index f6a0f330a327..9c0f7f3809df 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java @@ -16,6 +16,12 @@ package com.google.gcloud.spi; +import com.google.api.services.dns.model.Change; +import com.google.api.services.dns.model.ManagedZone; +import com.google.api.services.dns.model.Project; +import com.google.api.services.dns.model.ResourceRecordSet; +import com.google.gcloud.dns.DnsException; + import java.util.Map; public interface DnsRpc { @@ -52,5 +58,114 @@ Integer getInt(Map options) { } } - //TODO(mderka) add supported operations. Created issue #594. + class Tuple { + + private final X x; + private final Y y; + + private Tuple(X x, Y y) { + this.x = x; + this.y = y; + } + + public static Tuple of(X x, Y y) { + return new Tuple<>(x, y); + } + + public X x() { + return x; + } + + public Y y() { + return y; + } + } + + /** + * Creates a new zone. + * + * @param zone a zone to be created + * @return Updated {@link ManagedZone} object + * @throws DnsException upon failure + */ + ManagedZone create(ManagedZone zone) throws DnsException; + + /** + * Retrieves and returns an existing zone. + * + * @param zoneName name of the zone to be returned + * @param options a map of options for the service call + * @return a zone or {@code null} if not found + * @throws DnsException upon failure + */ + ManagedZone getZone(String zoneName, Map options) throws DnsException; + + /** + * Lists the zones that exist within the project. + * + * @param options a map of options for the service call + * @throws DnsException upon failure + */ + Tuple> listZones(Map options) throws DnsException; + + /** + * Deletes the zone identified by the name. + * + * @return {@code true} if the zone was deleted and {@code false} otherwise + * @throws DnsException upon failure + */ + boolean deleteZone(String zoneName) throws DnsException; + + /** + * Lists DNS records for a given zone. + * + * @param zoneName name of the zone to be listed + * @param options a map of options for the service call + * @throws DnsException upon failure or if zone not found + */ + Tuple> listDnsRecords(String zoneName, + Map options) throws DnsException; + + /** + * Returns information about the current project. + * + * @param options a map of options for the service call + * @return up-to-date project information + * @throws DnsException upon failure + */ + Project getProject(Map options) throws DnsException; + + /** + * Applies change request to a zone. + * + * @param zoneName the name of a zone to which the {@link Change} should be applied + * @param changeRequest change to be applied + * @param options a map of options for the service call + * @return updated change object with server-assigned ID + * @throws DnsException upon failure or if zone not found + */ + Change applyChangeRequest(String zoneName, Change changeRequest, Map options) + throws DnsException; + + /** + * Returns an existing change request. + * + * @param zoneName the name of a zone to which the {@link Change} was be applied + * @param changeRequestId the unique id assigned to the change by the server + * @param options a map of options for the service call + * @return up-to-date change object + * @throws DnsException upon failure or if zone not found + */ + Change getChangeRequest(String zoneName, String changeRequestId, Map options) + throws DnsException; + + /** + * List an existing change requests for a zone. + * + * @param zoneName the name of a zone to which the {@link Change}s were be applied + * @param options a map of options for the service call + * @throws DnsException upon failure or if zone not found + */ + Tuple> listChangeRequests(String zoneName, Map options) + throws DnsException; } From bc4b8204093d92782d04319c8efda9aae424b9cc Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Wed, 3 Feb 2016 10:46:44 -0800 Subject: [PATCH 38/50] Implements DefaultDnsRpc. Progress in #595. --- .../com/google/gcloud/dns/DnsException.java | 4 +- .../com/google/gcloud/dns/DnsOptions.java | 6 +- .../com/google/gcloud/spi/DefaultDnsRpc.java | 178 ++++++++++++++++++ 3 files changed, 183 insertions(+), 5 deletions(-) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java index d18f6163a881..73c546759260 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java @@ -27,8 +27,8 @@ public class DnsException extends BaseServiceException { private static final long serialVersionUID = 490302380416260252L; - public DnsException(IOException exception, boolean idempotent) { - super(exception, idempotent); + public DnsException(IOException exception) { + super(exception, true); } //TODO(mderka) Add translation and retry functionality. Created issue #593. diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java index 1845467c2537..248fd164a55f 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableSet; import com.google.gcloud.ServiceOptions; +import com.google.gcloud.spi.DefaultDnsRpc; import com.google.gcloud.spi.DnsRpc; import com.google.gcloud.spi.DnsRpcFactory; @@ -46,8 +47,7 @@ public static class DefaultDnsRpcFactory implements DnsRpcFactory { @Override public DnsRpc create(DnsOptions options) { - // TODO(mderka) Implement when DefaultDnsRpc is available. Created issue #595. - return null; + return new DefaultDnsRpc(options); } } @@ -80,7 +80,7 @@ protected DnsFactory defaultServiceFactory() { @SuppressWarnings("unchecked") @Override protected DnsRpcFactory defaultRpcFactory() { - return null; + return DefaultDnsRpcFactory.INSTANCE; } @Override diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java new file mode 100644 index 000000000000..77eb36e3b5ed --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java @@ -0,0 +1,178 @@ +package com.google.gcloud.spi; + +import static com.google.gcloud.spi.DnsRpc.Option.DNS_NAME; +import static com.google.gcloud.spi.DnsRpc.Option.DNS_TYPE; +import static com.google.gcloud.spi.DnsRpc.Option.FIELDS; +import static com.google.gcloud.spi.DnsRpc.Option.PAGE_SIZE; +import static com.google.gcloud.spi.DnsRpc.Option.PAGE_TOKEN; +import static com.google.gcloud.spi.DnsRpc.Option.SORTING_ORDER; +import static java.net.HttpURLConnection.HTTP_NOT_FOUND; + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.json.jackson.JacksonFactory; +import com.google.api.services.dns.Dns; +import com.google.api.services.dns.model.Change; +import com.google.api.services.dns.model.ChangesListResponse; +import com.google.api.services.dns.model.ManagedZone; +import com.google.api.services.dns.model.ManagedZonesListResponse; +import com.google.api.services.dns.model.Project; +import com.google.api.services.dns.model.ResourceRecordSet; +import com.google.api.services.dns.model.ResourceRecordSetsListResponse; +import com.google.gcloud.dns.DnsException; +import com.google.gcloud.dns.DnsOptions; + +import java.io.IOException; +import java.util.Map; + +/** + * A default implementation of the DnsRpc interface. + */ +public class DefaultDnsRpc implements DnsRpc { + + private final Dns dns; + private final DnsOptions options; + + private static DnsException translate(IOException exception) { + return new DnsException(exception); + } + + /** + * Constructs an instance of this rpc client with provided {@link DnsOptions}. + */ + public DefaultDnsRpc(DnsOptions options) { + HttpTransport transport = options.httpTransportFactory().create(); + HttpRequestInitializer initializer = options.httpRequestInitializer(); + this.dns = new Dns.Builder(transport, new JacksonFactory(), initializer) + .setRootUrl(options.host()) + .setApplicationName(options.applicationName()) + .build(); + this.options = options; + } + + @Override + public ManagedZone create(ManagedZone zone) throws DnsException { + try { + return dns.managedZones().create(this.options.projectId(), zone).execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public ManagedZone getZone(String zoneName, Map options) throws DnsException { + // just fields option + try { + return dns.managedZones().get(this.options.projectId(), zoneName) + .setFields(FIELDS.getString(options)).execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public Tuple> listZones(Map options) + throws DnsException { + // fields, page token, page size + try { + ManagedZonesListResponse zoneList = dns.managedZones().list(this.options.projectId()) + .setFields(FIELDS.getString(options)) + .setMaxResults(PAGE_SIZE.getInt(options)) + .setPageToken(PAGE_TOKEN.getString(options)) + .execute(); + return Tuple.>of(zoneList.getNextPageToken(), + zoneList.getManagedZones()); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public boolean deleteZone(String zoneName) throws DnsException { + try { + dns.managedZones().delete(this.options.projectId(), zoneName).execute(); + return true; + } catch (IOException ex) { + DnsException serviceException = translate(ex); + if (serviceException.code() == HTTP_NOT_FOUND) { + return false; + } + throw serviceException; + } + } + + @Override + public Tuple> listDnsRecords(String zoneName, + Map options) throws DnsException { + // options are fields, page token, dns name, type + try { + ResourceRecordSetsListResponse response = dns.resourceRecordSets() + .list(this.options.projectId(), zoneName) + .setFields(FIELDS.getString(options)) + .setPageToken(PAGE_TOKEN.getString(options)) + .setMaxResults(PAGE_SIZE.getInt(options)) + .setName(DNS_NAME.getString(options)) + .setType(DNS_TYPE.getString(options)) + .execute(); + return Tuple.>of(response.getNextPageToken(), + response.getRrsets()); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public Project getProject(Map options) throws DnsException { + try { + return dns.projects().get(this.options.projectId()) + .setFields(FIELDS.getString(options)).execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public Change applyChangeRequest(String zoneName, Change changeRequest, Map options) + throws DnsException { + try { + return dns.changes().create(this.options.projectId(), zoneName, changeRequest) + .setFields(FIELDS.getString(options)) + .execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public Change getChangeRequest(String zoneName, String changeRequestId, Map options) + throws DnsException { + try { + return dns.changes().get(this.options.projectId(), zoneName, changeRequestId) + .setFields(FIELDS.getString(options)) + .execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public Tuple> listChangeRequests(String zoneName, Map options) + throws DnsException { + // options are fields, page token, page size, sort order + try { + Dns.Changes.List request = dns.changes().list(this.options.projectId(), zoneName) + .setFields(FIELDS.getString(options)) + .setMaxResults(PAGE_SIZE.getInt(options)) + .setPageToken(PAGE_TOKEN.getString(options)); + if (SORTING_ORDER.getString(options) != null) { + // this needs to be checked and changed if more sorting options are implemented, issue #604 + String key = "changeSequence"; + request = request.setSortBy(key).setSortOrder(SORTING_ORDER.getString(options)); + } + ChangesListResponse response = request.execute(); + return Tuple.>of(response.getNextPageToken(), response.getChanges()); + } catch (IOException ex) { + throw translate(ex); + } + } +} From 896de75d1cad86e1b2cc2e82bb20700c240fd4ec Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Wed, 3 Feb 2016 14:34:38 -0800 Subject: [PATCH 39/50] Fixed documentation and null returns from rpc. --- .../com/google/gcloud/spi/DefaultDnsRpc.java | 26 ++++++++++++++----- .../java/com/google/gcloud/spi/DnsRpc.java | 22 ++++++++-------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java index 77eb36e3b5ed..85783d0fdcb6 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java @@ -30,6 +30,7 @@ */ public class DefaultDnsRpc implements DnsRpc { + private static final String SORTING_KEY = "changeSequence"; private final Dns dns; private final DnsOptions options; @@ -64,9 +65,14 @@ public ManagedZone getZone(String zoneName, Map options) throws DnsEx // just fields option try { return dns.managedZones().get(this.options.projectId(), zoneName) - .setFields(FIELDS.getString(options)).execute(); + .setFields(FIELDS.getString(options)) + .execute(); } catch (IOException ex) { - throw translate(ex); + DnsException serviceException = translate(ex); + if (serviceException.code() == HTTP_NOT_FOUND) { + return null; + } + throw serviceException; } } @@ -151,7 +157,16 @@ public Change getChangeRequest(String zoneName, String changeRequestId, Map> listChangeRequests(String zoneName, Map>of(response.getNextPageToken(), response.getChanges()); diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java index 9c0f7f3809df..bff396dedfab 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java @@ -85,7 +85,7 @@ public Y y() { * Creates a new zone. * * @param zone a zone to be created - * @return Updated {@link ManagedZone} object + * @return Updated {@code ManagedZone} object * @throws DnsException upon failure */ ManagedZone create(ManagedZone zone) throws DnsException; @@ -121,7 +121,7 @@ public Y y() { * * @param zoneName name of the zone to be listed * @param options a map of options for the service call - * @throws DnsException upon failure or if zone not found + * @throws DnsException upon failure or if zone was not found */ Tuple> listDnsRecords(String zoneName, Map options) throws DnsException; @@ -131,18 +131,18 @@ Tuple> listDnsRecords(String zoneName, * * @param options a map of options for the service call * @return up-to-date project information - * @throws DnsException upon failure + * @throws DnsException upon failure or if the project is not found */ Project getProject(Map options) throws DnsException; /** * Applies change request to a zone. * - * @param zoneName the name of a zone to which the {@link Change} should be applied + * @param zoneName the name of a zone to which the {@code Change} should be applied * @param changeRequest change to be applied * @param options a map of options for the service call * @return updated change object with server-assigned ID - * @throws DnsException upon failure or if zone not found + * @throws DnsException upon failure or if zone was not found */ Change applyChangeRequest(String zoneName, Change changeRequest, Map options) throws DnsException; @@ -150,21 +150,21 @@ Change applyChangeRequest(String zoneName, Change changeRequest, Map /** * Returns an existing change request. * - * @param zoneName the name of a zone to which the {@link Change} was be applied + * @param zoneName the name of a zone to which the {@code Change} was be applied * @param changeRequestId the unique id assigned to the change by the server * @param options a map of options for the service call - * @return up-to-date change object - * @throws DnsException upon failure or if zone not found + * @return up-to-date change object or {@code null} if change was not found + * @throws DnsException upon failure or if zone was not found */ Change getChangeRequest(String zoneName, String changeRequestId, Map options) throws DnsException; /** - * List an existing change requests for a zone. + * List existing change requests for a zone. * - * @param zoneName the name of a zone to which the {@link Change}s were be applied + * @param zoneName the name of a zone to which the {@code Change}s were be applied * @param options a map of options for the service call - * @throws DnsException upon failure or if zone not found + * @throws DnsException upon failure or if zone was not found */ Tuple> listChangeRequests(String zoneName, Map options) throws DnsException; From 3ae0f215d990f21b0c95fa1da07bbd8f8594fe1b Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 4 Feb 2016 09:11:09 -0800 Subject: [PATCH 40/50] Change Tuple into ListResult, added NAME option. --- .../main/java/com/google/gcloud/dns/Dns.java | 2 +- .../com/google/gcloud/spi/DefaultDnsRpc.java | 29 ++++++------ .../java/com/google/gcloud/spi/DnsRpc.java | 44 ++++++++++--------- .../java/com/google/gcloud/dns/DnsTest.java | 2 +- 4 files changed, 39 insertions(+), 38 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 644814fa201b..1227a9e3b323 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -230,7 +230,7 @@ public static DnsRecordListOption pageSize(int pageSize) { * Restricts the list to only DNS records with this fully qualified domain name. */ public static DnsRecordListOption dnsName(String dnsName) { - return new DnsRecordListOption(DnsRpc.Option.DNS_NAME, dnsName); + return new DnsRecordListOption(DnsRpc.Option.NAME, dnsName); } /** diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java index 85783d0fdcb6..73e6ab4036ec 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java @@ -1,6 +1,8 @@ package com.google.gcloud.spi; +import static com.google.gcloud.spi.DnsRpc.ListResult.of; import static com.google.gcloud.spi.DnsRpc.Option.DNS_NAME; +import static com.google.gcloud.spi.DnsRpc.Option.NAME; import static com.google.gcloud.spi.DnsRpc.Option.DNS_TYPE; import static com.google.gcloud.spi.DnsRpc.Option.FIELDS; import static com.google.gcloud.spi.DnsRpc.Option.PAGE_SIZE; @@ -30,7 +32,7 @@ */ public class DefaultDnsRpc implements DnsRpc { - private static final String SORTING_KEY = "changeSequence"; + private static final String SORT_BY = "changeSequence"; private final Dns dns; private final DnsOptions options; @@ -77,17 +79,16 @@ public ManagedZone getZone(String zoneName, Map options) throws DnsEx } @Override - public Tuple> listZones(Map options) - throws DnsException { + public ListResult listZones(Map options) throws DnsException { // fields, page token, page size try { ManagedZonesListResponse zoneList = dns.managedZones().list(this.options.projectId()) .setFields(FIELDS.getString(options)) .setMaxResults(PAGE_SIZE.getInt(options)) + .setDnsName(DNS_NAME.getString(options)) .setPageToken(PAGE_TOKEN.getString(options)) .execute(); - return Tuple.>of(zoneList.getNextPageToken(), - zoneList.getManagedZones()); + return of(zoneList.getNextPageToken(), zoneList.getManagedZones()); } catch (IOException ex) { throw translate(ex); } @@ -108,8 +109,8 @@ public boolean deleteZone(String zoneName) throws DnsException { } @Override - public Tuple> listDnsRecords(String zoneName, - Map options) throws DnsException { + public ListResult listDnsRecords(String zoneName, Map options) + throws DnsException { // options are fields, page token, dns name, type try { ResourceRecordSetsListResponse response = dns.resourceRecordSets() @@ -117,11 +118,10 @@ public Tuple> listDnsRecords(String zoneName .setFields(FIELDS.getString(options)) .setPageToken(PAGE_TOKEN.getString(options)) .setMaxResults(PAGE_SIZE.getInt(options)) - .setName(DNS_NAME.getString(options)) + .setName(NAME.getString(options)) .setType(DNS_TYPE.getString(options)) .execute(); - return Tuple.>of(response.getNextPageToken(), - response.getRrsets()); + return of(response.getNextPageToken(), response.getRrsets()); } catch (IOException ex) { throw translate(ex); } @@ -159,8 +159,7 @@ public Change getChangeRequest(String zoneName, String changeRequestId, Map> listChangeRequests(String zoneName, Map options) + public ListResult listChangeRequests(String zoneName, Map options) throws DnsException { // options are fields, page token, page size, sort order try { @@ -181,10 +180,10 @@ public Tuple> listChangeRequests(String zoneName, Map>of(response.getNextPageToken(), response.getChanges()); + return ListResult.of(response.getNextPageToken(), response.getChanges()); } catch (IOException ex) { throw translate(ex); } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java index bff396dedfab..c3cd3c690177 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java @@ -20,6 +20,7 @@ import com.google.api.services.dns.model.ManagedZone; import com.google.api.services.dns.model.Project; import com.google.api.services.dns.model.ResourceRecordSet; +import com.google.common.collect.ImmutableList; import com.google.gcloud.dns.DnsException; import java.util.Map; @@ -28,9 +29,10 @@ public interface DnsRpc { enum Option { FIELDS("fields"), - PAGE_SIZE("maxSize"), + PAGE_SIZE("maxResults"), PAGE_TOKEN("pageToken"), DNS_NAME("dnsName"), + NAME("name"), DNS_TYPE("type"), SORTING_ORDER("sortOrder"); @@ -58,26 +60,26 @@ Integer getInt(Map options) { } } - class Tuple { + class ListResult { - private final X x; - private final Y y; + private final Iterable results; + private final String pageToken; - private Tuple(X x, Y y) { - this.x = x; - this.y = y; + public ListResult(String pageToken, Iterable results) { + this.results = ImmutableList.copyOf(results); + this.pageToken = pageToken; } - public static Tuple of(X x, Y y) { - return new Tuple<>(x, y); + public static ListResult of(String pageToken, Iterable list) { + return new ListResult<>(pageToken, list); } - public X x() { - return x; + public Iterable results() { + return results; } - public Y y() { - return y; + public String pageToken() { + return pageToken; } } @@ -106,7 +108,7 @@ public Y y() { * @param options a map of options for the service call * @throws DnsException upon failure */ - Tuple> listZones(Map options) throws DnsException; + ListResult listZones(Map options) throws DnsException; /** * Deletes the zone identified by the name. @@ -123,12 +125,12 @@ public Y y() { * @param options a map of options for the service call * @throws DnsException upon failure or if zone was not found */ - Tuple> listDnsRecords(String zoneName, - Map options) throws DnsException; + ListResult listDnsRecords(String zoneName, Map options) + throws DnsException; /** * Returns information about the current project. - * + * * @param options a map of options for the service call * @return up-to-date project information * @throws DnsException upon failure or if the project is not found @@ -136,7 +138,7 @@ Tuple> listDnsRecords(String zoneName, Project getProject(Map options) throws DnsException; /** - * Applies change request to a zone. + * Applies change request to a zone. * * @param zoneName the name of a zone to which the {@code Change} should be applied * @param changeRequest change to be applied @@ -144,7 +146,7 @@ Tuple> listDnsRecords(String zoneName, * @return updated change object with server-assigned ID * @throws DnsException upon failure or if zone was not found */ - Change applyChangeRequest(String zoneName, Change changeRequest, Map options) + Change applyChangeRequest(String zoneName, Change changeRequest, Map options) throws DnsException; /** @@ -156,7 +158,7 @@ Change applyChangeRequest(String zoneName, Change changeRequest, Map * @return up-to-date change object or {@code null} if change was not found * @throws DnsException upon failure or if zone was not found */ - Change getChangeRequest(String zoneName, String changeRequestId, Map options) + Change getChangeRequest(String zoneName, String changeRequestId, Map options) throws DnsException; /** @@ -166,6 +168,6 @@ Change getChangeRequest(String zoneName, String changeRequestId, Map * @param options a map of options for the service call * @throws DnsException upon failure or if zone was not found */ - Tuple> listChangeRequests(String zoneName, Map options) + ListResult listChangeRequests(String zoneName, Map options) throws DnsException; } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java index a60cae1d1793..c2be251cea9e 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java @@ -34,7 +34,7 @@ public void testDnsRecordListOption() { String dnsName = "some name"; Dns.DnsRecordListOption dnsRecordListOption = Dns.DnsRecordListOption.dnsName(dnsName); assertEquals(dnsName, dnsRecordListOption.value()); - assertEquals(DnsRpc.Option.DNS_NAME, dnsRecordListOption.rpcOption()); + assertEquals(DnsRpc.Option.NAME, dnsRecordListOption.rpcOption()); // page token dnsRecordListOption = Dns.DnsRecordListOption.pageToken(PAGE_TOKEN); assertEquals(PAGE_TOKEN, dnsRecordListOption.value()); From 71f5ae22187569bf20461bcb6021761bc9864856 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 4 Feb 2016 13:54:44 -0800 Subject: [PATCH 41/50] Makes name of Zone mandatory and removes id-based methods. Also makes id a read-only string instead of BigInteger. Includes rewriting testsfor Zone. --- .../main/java/com/google/gcloud/dns/Dns.java | 81 +-- .../main/java/com/google/gcloud/dns/Zone.java | 127 +--- .../java/com/google/gcloud/dns/ZoneInfo.java | 35 +- .../com/google/gcloud/spi/DefaultDnsRpc.java | 2 +- .../com/google/gcloud/dns/ZoneInfoTest.java | 44 +- .../java/com/google/gcloud/dns/ZoneTest.java | 608 +++++------------- 6 files changed, 223 insertions(+), 674 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 1227a9e3b323..af0868ec17d6 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -23,7 +23,6 @@ import com.google.gcloud.spi.DnsRpc; import java.io.Serializable; -import java.math.BigInteger; import java.util.Set; /** @@ -69,8 +68,7 @@ static String selector(ProjectField... fields) { * The fields of a zone. * *

These values can be used to specify the fields to include in a partial response when calling - * {@link Dns#getZone(BigInteger, ZoneOption...)} or {@link Dns#getZone(String, ZoneOption...)}. - * The ID is always returned, even if not specified. + * {@link Dns#getZone(String, ZoneOption...)}. The ID is always returned, even if not specified. */ enum ZoneField { CREATION_TIME("creationTime"), @@ -105,9 +103,8 @@ static String selector(ZoneField... fields) { * The fields of a DNS record. * *

These values can be used to specify the fields to include in a partial response when calling - * {@link Dns#listDnsRecords(BigInteger, DnsRecordListOption...)} or {@link - * Dns#listDnsRecords(String, DnsRecordListOption...)}. The name is always returned even if not - * selected. + * {@link Dns#listDnsRecords(String, DnsRecordListOption...)}. The name is always returned even if + * not selected. */ enum DnsRecordField { DNS_RECORDS("rrdatas"), @@ -139,8 +136,7 @@ static String selector(DnsRecordField... fields) { * The fields of a change request. * *

These values can be used to specify the fields to include in a partial response when calling - * {@link Dns#applyChangeRequest(BigInteger, ChangeRequest, ChangeRequestOption...)} or {@link - * Dns#applyChangeRequest(String, ChangeRequest, ChangeRequestOption...)} The ID is always + * {@link Dns#applyChangeRequest(String, ChangeRequest, ChangeRequestOption...)} The ID is always * returned even if not selected. */ enum ChangeRequestField { @@ -444,16 +440,6 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { */ ZoneInfo getZone(String zoneName, ZoneOption... options); - /** - * Returns the zone by the specified zone id. Returns {@code null} if the zone is not found. The - * returned fields can be optionally restricted by specifying {@link ZoneOption}s. - * - * @throws DnsException upon failure - * @see Cloud DNS Managed Zones: - * get - */ - ZoneInfo getZone(BigInteger zoneId, ZoneOption... options); - /** * Lists the zones inside the project. * @@ -479,17 +465,6 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { */ boolean delete(String zoneName); // delete does not admit any options - /** - * Deletes an existing zone identified by id. Returns {@code true} if the zone was successfully - * deleted and {@code false} otherwise. - * - * @return {@code true} if zone was found and deleted and {@code false} otherwise - * @throws DnsException upon failure - * @see Cloud DNS Managed Zones: - * delete - */ - boolean delete(BigInteger zoneId); // delete does not admit any options - /** * Lists the DNS records in the zone identified by name. * @@ -502,18 +477,6 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { */ Page listDnsRecords(String zoneName, DnsRecordListOption... options); - /** - * Lists the DNS records in the zone identified by ID. - * - *

The fields to be returned, page size and page tokens can be specified using {@link - * DnsRecordListOption}s. - * - * @throws DnsException upon failure or if the zone cannot be found - * @see Cloud DNS - * ResourceRecordSets: list - */ - Page listDnsRecords(BigInteger zoneId, DnsRecordListOption... options); - /** * Retrieves the information about the current project. The returned fields can be optionally * restricted by specifying {@link ProjectOption}s. @@ -523,18 +486,6 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { */ ProjectInfo getProjectInfo(ProjectOption... fields); - /** - * Submits a change request for the specified zone. The returned object contains the following - * read-only fields supplied by the server: id, start time and status. time, id, and list of name - * servers. The fields to be returned can be selected by {@link ChangeRequestOption}s. - * - * @return the new {@link ChangeRequest} or {@code null} if zone is not found - * @throws DnsException upon failure - * @see Cloud DNS Changes: create - */ - ChangeRequest applyChangeRequest(BigInteger zoneId, ChangeRequest changeRequest, - ChangeRequestOption... options); - /** * Submits a change request for the specified zone. The returned object contains the following * read-only fields supplied by the server: id, start time and status. time, id, and list of name @@ -547,18 +498,6 @@ ChangeRequest applyChangeRequest(BigInteger zoneId, ChangeRequest changeRequest, ChangeRequest applyChangeRequest(String zoneName, ChangeRequest changeRequest, ChangeRequestOption... options); - /** - * Retrieves updated information about a change request previously submitted for a zone identified - * by ID. Returns {@code null} if the request cannot be found and throws an exception if the zone - * does not exist. The fields to be returned using can be specified using {@link - * ChangeRequestOption}s. - * - * @throws DnsException upon failure or if the zone cannot be found - * @see Cloud DNS Chages: get - */ - ChangeRequest getChangeRequest(BigInteger zoneId, String changeRequestId, - ChangeRequestOption... options); - /** * Retrieves updated information about a change request previously submitted for a zone identified * by ID. Returns {@code null} if the request cannot be found and throws an exception if the zone @@ -571,18 +510,6 @@ ChangeRequest getChangeRequest(BigInteger zoneId, String changeRequestId, ChangeRequest getChangeRequest(String zoneName, String changeRequestId, ChangeRequestOption... options); - /** - * Lists the change requests for the zone identified by ID that were submitted to the service. - * - *

The sorting order for changes (based on when they were received by the server), fields to be - * returned, page size and page token can be specified using {@link ChangeRequestListOption}s. - * - * @return A page of change requests - * @throws DnsException upon failure or if the zone cannot be found - * @see Cloud DNS Chages: list - */ - Page listChangeRequests(BigInteger zoneId, ChangeRequestListOption... options); - /** * Lists the change requests for the zone identified by name that were submitted to the service. * diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java index 86fc86bc3688..04edf332115d 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -16,13 +16,11 @@ package com.google.gcloud.dns; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import com.google.gcloud.Page; import java.io.Serializable; -import java.math.BigInteger; /** * A Google Cloud DNS Zone object. @@ -39,7 +37,7 @@ public class Zone implements Serializable { // TODO(mderka) Zone and zoneInfo to be merged. Opened issue #605. - private static final long serialVersionUID = -4012581571095484813L; + private static final long serialVersionUID = 6847890192129375500L; private final ZoneInfo zoneInfo; private final Dns dns; @@ -68,166 +66,81 @@ public static Zone get(Dns dnsService, String zoneName, Dns.ZoneOption... option } /** - * Constructs a {@code Zone} object that contains information received from the Google Cloud DNS - * service for the provided {@code zoneId}. - * - * @param zoneId ID of the zone to be searched for - * @param options optional restriction on what fields should be returned by the service - * @return zone object containing zone's information or {@code null} if not not found - * @throws DnsException upon failure - */ - public static Zone get(Dns dnsService, BigInteger zoneId, Dns.ZoneOption... options) { - checkNotNull(zoneId); - checkNotNull(dnsService); - ZoneInfo zoneInfo = dnsService.getZone(zoneId, options); - return zoneInfo == null ? null : new Zone(dnsService, zoneInfo); - } - - /** - * Retrieves the latest information about the zone. The method first attempts to retrieve the zone - * by ID and if not set or zone is not found, it searches by name. + * Retrieves the latest information about the zone. The method retrieves the zone by name which + * must always be initialized. * * @param options optional restriction on what fields should be fetched * @return zone object containing updated information or {@code null} if not not found * @throws DnsException upon failure - * @throws NullPointerException if both zone ID and name are not initialized */ public Zone reload(Dns.ZoneOption... options) { - checkNameOrIdNotNull(); - Zone zone = null; - if (zoneInfo.id() != null) { - zone = Zone.get(dns, zoneInfo.id(), options); - } - if (zone == null && zoneInfo.name() != null) { - // zone was not found by id or id is not set at all - zone = Zone.get(dns, zoneInfo.name(), options); - } - return zone; + return Zone.get(dns, zoneInfo.name(), options); } /** - * Deletes the zone. The method first attempts to delete the zone by ID. If the zone is not found - * or id is not set, it attempts to delete by name. + * Deletes the zone. The method first deletes the zone by name which must always be initialized. * * @return {@code true} is zone was found and deleted and {@code false} otherwise * @throws DnsException upon failure - * @throws NullPointerException if both zone ID and name are not initialized */ public boolean delete() { - checkNameOrIdNotNull(); - boolean deleted = false; - if (zoneInfo.id() != null) { - deleted = dns.delete(zoneInfo.id()); - } - if (!deleted && zoneInfo.name() != null) { - // zone was not found by id or id is not set at all - deleted = dns.delete(zoneInfo.name()); - } - return deleted; + return dns.delete(zoneInfo.name()); } /** - * Lists all {@link DnsRecord}s associated with this zone. First searches for zone by ID and if - * not found then by name. + * Lists all {@link DnsRecord}s associated with this zone. The method searches for zone by name + * which must always be initialized. * * @param options optional restriction on listing and fields of {@link DnsRecord}s returned * @return a page of DNS records * @throws DnsException upon failure or if the zone is not found - * @throws NullPointerException if both zone ID and name are not initialized */ public Page listDnsRecords(Dns.DnsRecordListOption... options) { - checkNameOrIdNotNull(); - Page page = null; - if (zoneInfo.id() != null) { - page = dns.listDnsRecords(zoneInfo.id(), options); - } - if (page == null && zoneInfo.name() != null) { - // zone was not found by id or id is not set at all - page = dns.listDnsRecords(zoneInfo.name(), options); - } - return page; + return dns.listDnsRecords(zoneInfo.name(), options); } /** - * Submits {@link ChangeRequest} to the service for it to applied to this zone. First searches for - * the zone by ID and if not found then by name. Returns a {@link ChangeRequest} with - * server-assigned ID or {@code null} if the zone was not found. + * Submits {@link ChangeRequest} to the service for it to applied to this zone. The method + * searches for zone by name which must always be initialized. * * @param options optional restriction on what fields of {@link ChangeRequest} should be returned * @return ChangeRequest with server-assigned ID * @throws DnsException upon failure or if the zone is not found - * @throws NullPointerException if both zone ID and name are not initialized */ public ChangeRequest applyChangeRequest(ChangeRequest changeRequest, Dns.ChangeRequestOption... options) { - checkNameOrIdNotNull(); checkNotNull(changeRequest); - ChangeRequest updated = null; - if (zoneInfo.id() != null) { - updated = dns.applyChangeRequest(zoneInfo.id(), changeRequest, options); - } - if (updated == null && zoneInfo.name() != null) { - // zone was not found by id or id is not set at all - updated = dns.applyChangeRequest(zoneInfo.name(), changeRequest, options); - } - return updated; + return dns.applyChangeRequest(zoneInfo.name(), changeRequest, options); } /** * Retrieves an updated information about a change request previously submitted to be applied to - * this zone. First searches for the zone by ID and if not found then by name. Returns a {@link - * ChangeRequest} if found and {@code null} is the zone or the change request was not found. + * this zone. The method searches for zone by name which must always be initialized. Returns a + * {@link ChangeRequest} if and {@code null} if the change request was not found. Throws {@link + * DnsException} if the zone is not found. * * @param options optional restriction on what fields of {@link ChangeRequest} should be returned * @return updated ChangeRequest * @throws DnsException upon failure or if the zone is not found - * @throws NullPointerException if both zone ID and name are not initialized * @throws NullPointerException if the change request does not have initialized id */ public ChangeRequest getChangeRequest(String changeRequestId, Dns.ChangeRequestOption... options) { - checkNameOrIdNotNull(); checkNotNull(changeRequestId); - ChangeRequest updated = null; - if (zoneInfo.id() != null) { - updated = dns.getChangeRequest(zoneInfo.id(), changeRequestId, options); - } - if (updated == null && zoneInfo.name() != null) { - // zone was not found by id or id is not set at all - updated = dns.getChangeRequest(zoneInfo.name(), changeRequestId, options); - } - return updated; + return dns.getChangeRequest(zoneInfo.name(), changeRequestId, options); } /** - * Retrieves all change requests for this zone. First searches for the zone by ID and if not found - * then by name. Returns a page of {@link ChangeRequest}s or {@code null} if the zone is not - * found. + * Retrieves all change requests for this zone. The method searches for zone by name which must + * always be initialized. Returns a page of {@link ChangeRequest}s. Throws a {@link DnsException} + * if the zone is not found. * * @param options optional restriction on listing and fields to be returned * @return a page of change requests * @throws DnsException upon failure or if the zone is not found - * @throws NullPointerException if both zone ID and name are not initialized */ public Page listChangeRequests(Dns.ChangeRequestListOption... options) { - checkNameOrIdNotNull(); - Page changeRequests = null; - if (zoneInfo.id() != null) { - changeRequests = dns.listChangeRequests(zoneInfo.id(), options); - } - if (changeRequests == null && zoneInfo.name() != null) { - // zone was not found by id or id is not set at all - changeRequests = dns.listChangeRequests(zoneInfo.name(), options); - } - return changeRequests; - } - - /** - * Check that at least one of name and ID are initialized and throw and exception if not. - */ - private void checkNameOrIdNotNull() { - checkArgument(zoneInfo != null && (zoneInfo.id() != null || zoneInfo.name() != null), - "Both zoneInfo.id and zoneInfo.name are null. This is should never happen."); + return dns.listChangeRequests(zoneInfo.name(), options); } /** diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java index 524309eaa8e9..09945fb72138 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java @@ -41,7 +41,7 @@ public class ZoneInfo implements Serializable { private static final long serialVersionUID = 201601191647L; private final String name; - private final BigInteger id; + private final String id; private final Long creationTimeMillis; private final String dnsName; private final String description; @@ -53,7 +53,7 @@ public class ZoneInfo implements Serializable { */ public static class Builder { private String name; - private BigInteger id; + private String id; private Long creationTimeMillis; private String dnsName; private String description; @@ -66,19 +66,10 @@ public static class Builder { private Builder() { } - private Builder(BigInteger id) { - this.id = checkNotNull(id); - } - private Builder(String name) { this.name = checkNotNull(name); } - private Builder(String name, BigInteger id) { - this.name = checkNotNull(name); - this.id = checkNotNull(id); - } - /** * Creates a builder from an existing ZoneInfo object. */ @@ -103,7 +94,7 @@ public Builder name(String name) { /** * Sets an id for the zone which is assigned to the zone by the server. */ - Builder id(BigInteger id) { + Builder id(String id) { this.id = id; return this; } @@ -178,20 +169,6 @@ public static Builder builder(String name) { return new Builder(name); } - /** - * Returns a builder for {@code ZoneInfo} with an assigned {@code id}. - */ - public static Builder builder(BigInteger id) { - return new Builder(id); - } - - /** - * Returns a builder for {@code ZoneInfo} with an assigned {@code name} and {@code id}. - */ - public static Builder builder(String name, BigInteger id) { - return new Builder(name, id); - } - /** * Returns the user-defined name of the zone. */ @@ -202,7 +179,7 @@ public String name() { /** * Returns the read-only zone id assigned by the server. */ - public BigInteger id() { + public String id() { return id; } @@ -255,7 +232,7 @@ com.google.api.services.dns.model.ManagedZone toPb() { pb.setDescription(this.description()); pb.setDnsName(this.dnsName()); if (this.id() != null) { - pb.setId(this.id()); + pb.setId(new BigInteger(this.id())); } pb.setName(this.name()); pb.setNameServers(this.nameServers()); @@ -277,7 +254,7 @@ static ZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) { builder.dnsName(pb.getDnsName()); } if (pb.getId() != null) { - builder.id(pb.getId()); + builder.id(pb.getId().toString()); } if (pb.getName() != null) { builder.name(pb.getName()); diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java index 73e6ab4036ec..12596da02bf6 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java @@ -2,9 +2,9 @@ import static com.google.gcloud.spi.DnsRpc.ListResult.of; import static com.google.gcloud.spi.DnsRpc.Option.DNS_NAME; -import static com.google.gcloud.spi.DnsRpc.Option.NAME; import static com.google.gcloud.spi.DnsRpc.Option.DNS_TYPE; import static com.google.gcloud.spi.DnsRpc.Option.FIELDS; +import static com.google.gcloud.spi.DnsRpc.Option.NAME; import static com.google.gcloud.spi.DnsRpc.Option.PAGE_SIZE; import static com.google.gcloud.spi.DnsRpc.Option.PAGE_TOKEN; import static com.google.gcloud.spi.DnsRpc.Option.SORTING_ORDER; diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneInfoTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneInfoTest.java index 2c9fea8f7bde..227916b46f96 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneInfoTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneInfoTest.java @@ -26,14 +26,13 @@ import org.junit.Test; -import java.math.BigInteger; import java.util.LinkedList; import java.util.List; public class ZoneInfoTest { private static final String NAME = "mz-example.com"; - private static final BigInteger ID = BigInteger.valueOf(123L); + private static final String ID = "123456"; private static final Long CREATION_TIME_MILLIS = 1123468321321L; private static final String DNS_NAME = "example.com."; private static final String DESCRIPTION = "description for the zone"; @@ -42,8 +41,9 @@ public class ZoneInfoTest { private static final String NS2 = "name server 2"; private static final String NS3 = "name server 3"; private static final List NAME_SERVERS = ImmutableList.of(NS1, NS2, NS3); - private static final ZoneInfo INFO = ZoneInfo.builder(NAME, ID) + private static final ZoneInfo INFO = ZoneInfo.builder(NAME) .creationTimeMillis(CREATION_TIME_MILLIS) + .id(ID) .dnsName(DNS_NAME) .description(DESCRIPTION) .nameServerSet(NAME_SERVER_SET) @@ -52,30 +52,14 @@ public class ZoneInfoTest { @Test public void testDefaultBuilders() { - ZoneInfo withName = ZoneInfo.builder(NAME).build(); - assertTrue(withName.nameServers().isEmpty()); - assertEquals(NAME, withName.name()); - assertNull(withName.id()); - assertNull(withName.creationTimeMillis()); - assertNull(withName.nameServerSet()); - assertNull(withName.description()); - assertNull(withName.dnsName()); - ZoneInfo withId = ZoneInfo.builder(ID).build(); - assertTrue(withId.nameServers().isEmpty()); - assertEquals(ID, withId.id()); - assertNull(withId.name()); - assertNull(withId.creationTimeMillis()); - assertNull(withId.nameServerSet()); - assertNull(withId.description()); - assertNull(withId.dnsName()); - ZoneInfo withBoth = ZoneInfo.builder(NAME, ID).build(); - assertTrue(withBoth.nameServers().isEmpty()); - assertEquals(ID, withBoth.id()); - assertEquals(NAME, withBoth.name()); - assertNull(withBoth.creationTimeMillis()); - assertNull(withBoth.nameServerSet()); - assertNull(withBoth.description()); - assertNull(withBoth.dnsName()); + ZoneInfo zone = ZoneInfo.builder(NAME).build(); + assertTrue(zone.nameServers().isEmpty()); + assertEquals(NAME, zone.name()); + assertNull(zone.id()); + assertNull(zone.creationTimeMillis()); + assertNull(zone.nameServerSet()); + assertNull(zone.description()); + assertNull(zone.dnsName()); } @Test @@ -109,7 +93,7 @@ public void testEqualsAndNotEquals() { assertNotEquals(INFO, clone); clone = INFO.toBuilder().dnsName(differentName).build(); assertNotEquals(INFO, clone); - clone = INFO.toBuilder().id(INFO.id().add(BigInteger.ONE)).build(); + clone = INFO.toBuilder().id(INFO.id() + "1111").build(); assertNotEquals(INFO, clone); clone = INFO.toBuilder().nameServerSet(INFO.nameServerSet() + "salt").build(); assertNotEquals(INFO, clone); @@ -127,7 +111,7 @@ public void testToBuilder() { assertEquals(INFO, INFO.toBuilder().build()); ZoneInfo partial = ZoneInfo.builder(NAME).build(); assertEquals(partial, partial.toBuilder().build()); - partial = ZoneInfo.builder(ID).build(); + partial = ZoneInfo.builder(NAME).id(ID).build(); assertEquals(partial, partial.toBuilder().build()); partial = ZoneInfo.builder(NAME).description(DESCRIPTION).build(); assertEquals(partial, partial.toBuilder().build()); @@ -148,7 +132,7 @@ public void testToAndFromPb() { assertEquals(INFO, ZoneInfo.fromPb(INFO.toPb())); ZoneInfo partial = ZoneInfo.builder(NAME).build(); assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); - partial = ZoneInfo.builder(ID).build(); + partial = ZoneInfo.builder(NAME).id(ID).build(); assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); partial = ZoneInfo.builder(NAME).description(DESCRIPTION).build(); assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java index c746140ce599..59cb642167ed 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java @@ -22,7 +22,6 @@ import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; @@ -35,24 +34,19 @@ import org.junit.Before; import org.junit.Test; -import java.math.BigInteger; - public class ZoneTest { private static final String ZONE_NAME = "dns-zone-name"; - private static final BigInteger ZONE_ID = new BigInteger("123"); - private static final ZoneInfo ZONE_INFO = ZoneInfo.builder(ZONE_NAME, ZONE_ID) + private static final String ZONE_ID = "123"; + private static final ZoneInfo ZONE_INFO = ZoneInfo.builder(ZONE_NAME) + .id(ZONE_ID) .dnsName("example.com") .creationTimeMillis(123478946464L) .build(); private static final ZoneInfo NO_ID_INFO = ZoneInfo.builder(ZONE_NAME) - .dnsName("anoter-example.com") + .dnsName("another-example.com") .creationTimeMillis(893123464L) .build(); - private static final ZoneInfo NO_NAME_INFO = ZoneInfo.builder(ZONE_ID) - .dnsName("one-more-example.com") - .creationTimeMillis(875221546464L) - .build(); private static final Dns.ZoneOption ZONE_FIELD_OPTIONS = Dns.ZoneOption.fields(Dns.ZoneField.CREATION_TIME); private static final Dns.DnsRecordListOption DNS_RECORD_OPTIONS = @@ -65,10 +59,10 @@ public class ZoneTest { private static final ChangeRequest CHANGE_REQUEST_AFTER = CHANGE_REQUEST.toBuilder() .startTimeMillis(123465L).build(); private static final ChangeRequest CHANGE_REQUEST_NO_ID = ChangeRequest.builder().build(); + private static final DnsException EXCEPTION = createStrictMock(DnsException.class); private Dns dns; private Zone zone; - private Zone zoneNoName; private Zone zoneNoId; @Before @@ -76,7 +70,6 @@ public void setUp() throws Exception { dns = createStrictMock(Dns.class); zone = new Zone(dns, ZONE_INFO); zoneNoId = new Zone(dns, NO_ID_INFO); - zoneNoName = new Zone(dns, NO_NAME_INFO); } @After @@ -93,40 +86,18 @@ public void testConstructor() { assertEquals(dns, zone.dns()); } - @Test - public void testGetById() { - expect(dns.getZone(ZONE_ID)).andReturn(ZONE_INFO); - expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(ZONE_INFO); // for options - replay(dns); - Zone retrieved = Zone.get(dns, ZONE_ID); - assertSame(dns, retrieved.dns()); - assertEquals(ZONE_INFO, retrieved.info()); - try { - Zone.get(dns, (BigInteger) null); - fail("Cannot get by null id."); - } catch (NullPointerException e) { - // expected - } - try { - Zone.get(null, new BigInteger("12")); - fail("Cannot get anything from null service."); - } catch (NullPointerException e) { - // expected - } - // test passing options - Zone.get(dns, ZONE_ID, ZONE_FIELD_OPTIONS); - } - @Test public void testGetByName() { expect(dns.getZone(ZONE_NAME)).andReturn(ZONE_INFO); - expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(ZONE_INFO); // for options + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(ZONE_INFO); // for options replay(dns); Zone retrieved = Zone.get(dns, ZONE_NAME); assertSame(dns, retrieved.dns()); assertEquals(ZONE_INFO, retrieved.info()); + // test passing options + Zone.get(dns, ZONE_NAME, ZONE_FIELD_OPTIONS); try { - Zone.get(dns, (String) null); + Zone.get(dns, null); fail("Cannot get by null name."); } catch (NullPointerException e) { // expected @@ -137,311 +108,177 @@ public void testGetByName() { } catch (NullPointerException e) { // expected } - // test passing options - Zone.get(dns, ZONE_ID, ZONE_FIELD_OPTIONS); } @Test - public void deleteByIdAndFound() { - expect(dns.delete(ZONE_ID)).andReturn(true); - replay(dns); - boolean result = zone.delete(); - assertTrue(result); - } - - @Test - public void deleteByIdAndNotFoundAndNameSetAndFound() { - expect(dns.delete(ZONE_ID)).andReturn(false); + public void deleteByNameAndFound() { + expect(dns.delete(ZONE_NAME)).andReturn(true); expect(dns.delete(ZONE_NAME)).andReturn(true); replay(dns); boolean result = zone.delete(); assertTrue(result); - } - - @Test - public void deleteByIdAndNotFoundAndNameSetAndNotFound() { - expect(dns.delete(ZONE_ID)).andReturn(false); - expect(dns.delete(ZONE_NAME)).andReturn(false); - replay(dns); - boolean result = zone.delete(); - assertFalse(result); - } - - @Test - public void deleteByIdAndNotFoundAndNameNotSet() { - expect(dns.delete(ZONE_ID)).andReturn(false); - replay(dns); - boolean result = zoneNoName.delete(); - assertFalse(result); - } - - @Test - public void deleteByNameAndFound() { - expect(dns.delete(ZONE_NAME)).andReturn(true); - replay(dns); - boolean result = zoneNoId.delete(); + result = zoneNoId.delete(); assertTrue(result); } @Test public void deleteByNameAndNotFound() { - expect(dns.delete(ZONE_NAME)).andReturn(true); + expect(dns.delete(ZONE_NAME)).andReturn(false); + expect(dns.delete(ZONE_NAME)).andReturn(false); replay(dns); boolean result = zoneNoId.delete(); - assertTrue(result); - } - - @Test - public void listDnsRecordsByIdAndFound() { - @SuppressWarnings("unchecked") - Page pageMock = createStrictMock(Page.class); - replay(pageMock); - expect(dns.listDnsRecords(ZONE_ID)).andReturn(pageMock); - // again for options - expect(dns.listDnsRecords(ZONE_ID, DNS_RECORD_OPTIONS)).andReturn(pageMock); - replay(dns); - Page result = zone.listDnsRecords(); - assertSame(pageMock, result); - verify(pageMock); - // verify options - zone.listDnsRecords(DNS_RECORD_OPTIONS); + assertFalse(result); + result = zone.delete(); + assertFalse(result); } @Test - public void listDnsRecordsByIdAndNotFoundAndNameSetAndFound() { + public void listDnsRecordsByNameAndFound() { @SuppressWarnings("unchecked") Page pageMock = createStrictMock(Page.class); replay(pageMock); - expect(dns.listDnsRecords(ZONE_ID)).andReturn(null); + expect(dns.listDnsRecords(ZONE_NAME)).andReturn(pageMock); expect(dns.listDnsRecords(ZONE_NAME)).andReturn(pageMock); // again for options - expect(dns.listDnsRecords(ZONE_ID, DNS_RECORD_OPTIONS)).andReturn(null); + expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andReturn(pageMock); expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andReturn(pageMock); replay(dns); Page result = zone.listDnsRecords(); assertSame(pageMock, result); - verify(pageMock); - // verify options - zone.listDnsRecords(DNS_RECORD_OPTIONS); - } - - @Test - public void listDnsRecordsByIdAndNotFoundAndNameSetAndNotFound() { - expect(dns.listDnsRecords(ZONE_ID)).andReturn(null); - expect(dns.listDnsRecords(ZONE_NAME)).andReturn(null); - // again for options - expect(dns.listDnsRecords(ZONE_ID, DNS_RECORD_OPTIONS)).andReturn(null); - expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andReturn(null); - replay(dns); - Page result = zone.listDnsRecords(); - assertNull(result); - // check options - zone.listDnsRecords(DNS_RECORD_OPTIONS); - } - - @Test - public void listDnsRecordsByIdAndNotFoundAndNameNotSet() { - expect(dns.listDnsRecords(ZONE_ID)).andReturn(null); - expect(dns.listDnsRecords(ZONE_ID, DNS_RECORD_OPTIONS)).andReturn(null); // for options - replay(dns); - Page result = zoneNoName.listDnsRecords(); - assertNull(result); - zoneNoName.listDnsRecords(DNS_RECORD_OPTIONS); // check options - } - - @Test - public void listDnsRecordsByNameAndFound() { - @SuppressWarnings("unchecked") - Page pageMock = createStrictMock(Page.class); - replay(pageMock); - expect(dns.listDnsRecords(ZONE_NAME)).andReturn(pageMock); - // again for options - expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andReturn(pageMock); - replay(dns); - Page result = zoneNoId.listDnsRecords(); + result = zoneNoId.listDnsRecords(); assertSame(pageMock, result); verify(pageMock); + zone.listDnsRecords(DNS_RECORD_OPTIONS); // check options zoneNoId.listDnsRecords(DNS_RECORD_OPTIONS); // check options } @Test public void listDnsRecordsByNameAndNotFound() { - expect(dns.listDnsRecords(ZONE_NAME)).andReturn(null); - // again for options - expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andReturn(null); - replay(dns); - Page result = zoneNoId.listDnsRecords(); - assertNull(result); - zoneNoId.listDnsRecords(DNS_RECORD_OPTIONS); // check options - } - - @Test - public void reloadByIdAndFound() { - expect(dns.getZone(ZONE_ID)).andReturn(zone.info()); - expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(zone.info()); // for options - replay(dns); - Zone result = zone.reload(); - assertSame(zone.dns(), result.dns()); - assertEquals(zone.info(), result.info()); - zone.reload(ZONE_FIELD_OPTIONS); // for options - } - - @Test - public void reloadByIdAndNotFoundAndNameSetAndFound() { - expect(dns.getZone(ZONE_ID)).andReturn(null); - expect(dns.getZone(ZONE_NAME)).andReturn(zone.info()); - // again for options - expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(null); - expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zone.info()); - replay(dns); - Zone result = zone.reload(); - assertSame(zone.dns(), result.dns()); - assertEquals(zone.info(), result.info()); - zone.reload(ZONE_FIELD_OPTIONS); // for options - } - - @Test - public void reloadByIdAndNotFoundAndNameSetAndNotFound() { - expect(dns.getZone(ZONE_ID)).andReturn(null); - expect(dns.getZone(ZONE_NAME)).andReturn(null); - // again with options - expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(null); - expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(null); - replay(dns); - Zone result = zone.reload(); - assertNull(result); + expect(dns.listDnsRecords(ZONE_NAME)).andThrow(EXCEPTION); + expect(dns.listDnsRecords(ZONE_NAME)).andThrow(EXCEPTION); // again for options - zone.reload(ZONE_FIELD_OPTIONS); - } - - @Test - public void reloadByIdAndNotFoundAndNameNotSet() { - expect(dns.getZone(ZONE_ID)).andReturn(null); - expect(dns.getZone(ZONE_ID, ZONE_FIELD_OPTIONS)).andReturn(null); // for options + expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andThrow(EXCEPTION); + expect(dns.listDnsRecords(ZONE_NAME, DNS_RECORD_OPTIONS)).andThrow(EXCEPTION); replay(dns); - Zone result = zoneNoName.reload(); - assertNull(result); - zoneNoName.reload(ZONE_FIELD_OPTIONS); // for options + try { + zoneNoId.listDnsRecords(); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + zone.listDnsRecords(); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + zoneNoId.listDnsRecords(DNS_RECORD_OPTIONS); // check options + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + zone.listDnsRecords(DNS_RECORD_OPTIONS); // check options + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } } @Test public void reloadByNameAndFound() { expect(dns.getZone(ZONE_NAME)).andReturn(zoneNoId.info()); + expect(dns.getZone(ZONE_NAME)).andReturn(zone.info()); // again for options expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zoneNoId.info()); + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zone.info()); replay(dns); Zone result = zoneNoId.reload(); assertSame(zoneNoId.dns(), result.dns()); assertEquals(zoneNoId.info(), result.info()); + result = zone.reload(); + assertSame(zone.dns(), result.dns()); + assertEquals(zone.info(), result.info()); zoneNoId.reload(ZONE_FIELD_OPTIONS); // check options + zone.reload(ZONE_FIELD_OPTIONS); // check options } @Test public void reloadByNameAndNotFound() { + expect(dns.getZone(ZONE_NAME)).andReturn(null); expect(dns.getZone(ZONE_NAME)).andReturn(null); // again for options expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(null); + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(null); replay(dns); Zone result = zoneNoId.reload(); assertNull(result); + result = zone.reload(); + assertNull(result); zoneNoId.reload(ZONE_FIELD_OPTIONS); // for options + zone.reload(ZONE_FIELD_OPTIONS); // for options } @Test - public void applyChangeByIdAndFound() { - expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST)).andReturn(CHANGE_REQUEST_AFTER); - // again for options - expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) + public void applyChangeByNameAndFound() { + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)) .andReturn(CHANGE_REQUEST_AFTER); - replay(dns); - ChangeRequest result = zone.applyChangeRequest(CHANGE_REQUEST); - assertNotEquals(CHANGE_REQUEST, result); - assertEquals(CHANGE_REQUEST_AFTER, result); - // for options - result = zone.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); - assertNotEquals(CHANGE_REQUEST, result); - assertEquals(CHANGE_REQUEST_AFTER, result); - } - - @Test - public void applyChangeByIdAndNotFoundAndNameSetAndFound() { - expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST)).andReturn(null); expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)) .andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(null); expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); - replay(dns); - ChangeRequest result = zone.applyChangeRequest(CHANGE_REQUEST); - assertNotEquals(CHANGE_REQUEST, result); - assertEquals(CHANGE_REQUEST_AFTER, result); - // for options - result = zone.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); - assertNotEquals(CHANGE_REQUEST, result); - assertEquals(CHANGE_REQUEST_AFTER, result); - } - - @Test - public void applyChangeIdAndNotFoundAndNameSetAndNotFound() { - expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST)).andReturn(null); - expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)).andReturn(null); - // again with options - expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(null); - expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(null); - replay(dns); - ChangeRequest result = zone.applyChangeRequest(CHANGE_REQUEST); - assertNull(result); - // again for options - result = zone.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); - assertNull(result); - } - - @Test - public void applyChangeRequestByIdAndNotFoundAndNameNotSet() { - expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST)).andReturn(null); - expect(dns.applyChangeRequest(ZONE_ID, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(null); // for options - replay(dns); - ChangeRequest result = zoneNoName.applyChangeRequest(CHANGE_REQUEST); - assertNull(result); - // again for options - result = zoneNoName.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); - assertNull(result); - } - - @Test - public void applyChangeByNameAndFound() { - // ID is not set - expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)) - .andReturn(CHANGE_REQUEST_AFTER); - // again for options expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); ChangeRequest result = zoneNoId.applyChangeRequest(CHANGE_REQUEST); assertEquals(CHANGE_REQUEST_AFTER, result); + result = zone.applyChangeRequest(CHANGE_REQUEST); + assertEquals(CHANGE_REQUEST_AFTER, result); // check options result = zoneNoId.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); assertEquals(CHANGE_REQUEST_AFTER, result); + result = zone.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + assertEquals(CHANGE_REQUEST_AFTER, result); } @Test public void applyChangeByNameAndNotFound() { // ID is not set - expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)).andReturn(null); + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)).andThrow(EXCEPTION); + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST)).andThrow(EXCEPTION); // again for options expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(null); + .andThrow(EXCEPTION); + expect(dns.applyChangeRequest(ZONE_NAME, CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS)) + .andThrow(EXCEPTION); replay(dns); - ChangeRequest result = zoneNoId.applyChangeRequest(CHANGE_REQUEST); - assertNull(result); + try { + zoneNoId.applyChangeRequest(CHANGE_REQUEST); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + zone.applyChangeRequest(CHANGE_REQUEST); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } // check options - result = zoneNoId.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); - assertNull(result); + try { + zoneNoId.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + zone.applyChangeRequest(CHANGE_REQUEST, CHANGE_REQUEST_FIELD_OPTIONS); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } } @Test @@ -471,116 +308,82 @@ public void applyNullChangeRequest() { } catch (NullPointerException e) { // expected } - try { - zoneNoName.applyChangeRequest(null); - fail("Cannot apply null ChangeRequest."); - } catch (NullPointerException e) { - // expected - } - try { - zoneNoName.applyChangeRequest(null, CHANGE_REQUEST_FIELD_OPTIONS); - fail("Cannot apply null ChangeRequest."); - } catch (NullPointerException e) { - // expected - } } @Test - public void getChangeByIdAndFound() { - expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id())).andReturn(CHANGE_REQUEST_AFTER); - // again for options - expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) + public void getChangeAndZoneFoundByName() { + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())) .andReturn(CHANGE_REQUEST_AFTER); - replay(dns); - ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); - assertNotEquals(CHANGE_REQUEST, result); - assertEquals(CHANGE_REQUEST_AFTER, result); - // for options - result = zone.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); - assertNotEquals(CHANGE_REQUEST, result); - assertEquals(CHANGE_REQUEST_AFTER, result); - // test no id - } - - @Test - public void getChangeByIdAndNotFoundAndNameSetAndFound() { - expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id())).andReturn(null); expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())) .andReturn(CHANGE_REQUEST_AFTER); // again for options - expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(null); + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(CHANGE_REQUEST_AFTER); expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(CHANGE_REQUEST_AFTER); replay(dns); - ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); - assertNotEquals(CHANGE_REQUEST, result); + ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); assertEquals(CHANGE_REQUEST_AFTER, result); - // for options - result = zone.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); - assertNotEquals(CHANGE_REQUEST, result); + result = zone.getChangeRequest(CHANGE_REQUEST.id()); + assertEquals(CHANGE_REQUEST_AFTER, result); + // check options + result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); assertEquals(CHANGE_REQUEST_AFTER, result); - } - - @Test - public void getChangeIdAndNotFoundAndNameSetAndNotFound() { - expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id())).andReturn(null); - expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())).andReturn(null); - // again with options - expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(null); - expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(null); - replay(dns); - ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); - assertNull(result); - // again for options result = zone.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); - assertNull(result); - } - - @Test - public void getChangeRequestByIdAndNotFoundAndNameNotSet() { - expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id())).andReturn(null); - expect(dns.getChangeRequest(ZONE_ID, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(null); // for options - replay(dns); - ChangeRequest result = zoneNoName.getChangeRequest(CHANGE_REQUEST.id()); - assertNull(result); - // again for options - result = zoneNoName.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); - assertNull(result); + assertEquals(CHANGE_REQUEST_AFTER, result); } @Test - public void getChangeByNameAndFound() { - // ID is not set - expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())) - .andReturn(CHANGE_REQUEST_AFTER); + public void getChangeAndZoneNotFoundByName() { + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())).andThrow(EXCEPTION); + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())).andThrow(EXCEPTION); // again for options expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) - .andReturn(CHANGE_REQUEST_AFTER); + .andThrow(EXCEPTION); + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) + .andThrow(EXCEPTION); replay(dns); - ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); - assertEquals(CHANGE_REQUEST_AFTER, result); + try { + ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } // check options - result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); - assertEquals(CHANGE_REQUEST_AFTER, result); + try { + zoneNoId.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + zone.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } } @Test - public void getChangeByNameAndNotFound() { - // ID is not set + public void getChangedWhichDoesNotExistZoneFound() { + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())).andReturn(null); expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id())).andReturn(null); // again for options + expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) + .andReturn(null); expect(dns.getChangeRequest(ZONE_NAME, CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)) .andReturn(null); replay(dns); - ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); - assertNull(result); - // check options - result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS); - assertNull(result); + assertNull(zoneNoId.getChangeRequest(CHANGE_REQUEST.id())); + assertNull(zone.getChangeRequest(CHANGE_REQUEST.id())); + assertNull(zoneNoId.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)); + assertNull(zone.getChangeRequest(CHANGE_REQUEST.id(), CHANGE_REQUEST_FIELD_OPTIONS)); } @Test @@ -610,18 +413,6 @@ public void getNullChangeRequest() { } catch (NullPointerException e) { // expected } - try { - zoneNoName.getChangeRequest(null); - fail("Cannot get null ChangeRequest."); - } catch (NullPointerException e) { - // expected - } - try { - zoneNoName.getChangeRequest(null, CHANGE_REQUEST_FIELD_OPTIONS); - fail("Cannot get null ChangeRequest."); - } catch (NullPointerException e) { - // expected - } } @Test @@ -651,104 +442,61 @@ public void getChangeRequestWithNoId() { } catch (NullPointerException e) { // expected } - try { - zoneNoName.getChangeRequest(CHANGE_REQUEST_NO_ID.id()); - fail("Cannot get ChangeRequest by null id."); - } catch (NullPointerException e) { - // expected - } - try { - zoneNoName.getChangeRequest(CHANGE_REQUEST_NO_ID.id(), CHANGE_REQUEST_FIELD_OPTIONS); - fail("Cannot get ChangeRequest by null id."); - } catch (NullPointerException e) { - // expected - } - } - - @Test - public void listChangeRequestsByIdAndFound() { - @SuppressWarnings("unchecked") - Page pageMock = createStrictMock(Page.class); - replay(pageMock); - expect(dns.listChangeRequests(ZONE_ID)).andReturn(pageMock); - // again for options - expect(dns.listChangeRequests(ZONE_ID, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(pageMock); - replay(dns); - Page result = zone.listChangeRequests(); - assertSame(pageMock, result); - verify(pageMock); - // verify options - zone.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); } @Test - public void listChangeRequestsByIdAndNotFoundAndNameSetAndFound() { + public void listChangeRequestsAndZoneFound() { @SuppressWarnings("unchecked") Page pageMock = createStrictMock(Page.class); replay(pageMock); - expect(dns.listChangeRequests(ZONE_ID)).andReturn(null); + expect(dns.listChangeRequests(ZONE_NAME)).andReturn(pageMock); expect(dns.listChangeRequests(ZONE_NAME)).andReturn(pageMock); // again for options - expect(dns.listChangeRequests(ZONE_ID, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)) .andReturn(pageMock); - replay(dns); - Page result = zone.listChangeRequests(); - assertSame(pageMock, result); - verify(pageMock); - // verify options - zone.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); - } - - @Test - public void listChangeRequestsByIdAndNotFoundAndNameSetAndNotFound() { - expect(dns.listChangeRequests(ZONE_ID)).andReturn(null); - expect(dns.listChangeRequests(ZONE_NAME)).andReturn(null); - // again for options - expect(dns.listChangeRequests(ZONE_ID, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); - expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); - replay(dns); - Page result = zone.listChangeRequests(); - assertNull(result); - // check options - zone.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); - } - - @Test - public void listChangeRequestsByIdAndNotFoundAndNameNotSet() { - expect(dns.listChangeRequests(ZONE_ID)).andReturn(null); - // again for options - expect(dns.listChangeRequests(ZONE_ID, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); - replay(dns); - Page result = zoneNoName.listChangeRequests(); - assertNull(result); - zoneNoName.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); // check options - } - - @Test - public void listChangeRequestsByNameAndFound() { - @SuppressWarnings("unchecked") - Page pageMock = createStrictMock(Page.class); - replay(pageMock); - expect(dns.listChangeRequests(ZONE_NAME)).andReturn(pageMock); - // again for options expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)) .andReturn(pageMock); replay(dns); Page result = zoneNoId.listChangeRequests(); assertSame(pageMock, result); + result = zone.listChangeRequests(); + assertSame(pageMock, result); verify(pageMock); zoneNoId.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); // check options + zone.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); // check options } @Test - public void listChangeRequestsByNameAndNotFound() { - expect(dns.listChangeRequests(ZONE_NAME)).andReturn(null); + public void listChangeRequestsAndZoneNotFound() { + expect(dns.listChangeRequests(ZONE_NAME)).andThrow(EXCEPTION); + expect(dns.listChangeRequests(ZONE_NAME)).andThrow(EXCEPTION); // again for options - expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)).andReturn(null); + expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)).andThrow(EXCEPTION); + expect(dns.listChangeRequests(ZONE_NAME, CHANGE_REQUEST_LIST_OPTIONS)).andThrow(EXCEPTION); replay(dns); - Page result = zoneNoId.listChangeRequests(); - assertNull(result); - zoneNoId.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); // check options + try { + zoneNoId.listChangeRequests(); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + zone.listChangeRequests(); + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + zoneNoId.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); // check options + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } + try { + zone.listChangeRequests(CHANGE_REQUEST_LIST_OPTIONS); // check options + fail("Parent container not found, should throw an exception."); + } catch (DnsException e) { + // expected + } } } From 3183f4a7445dcb5e8992132ec5463bbced65c07b Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 4 Feb 2016 14:04:45 -0800 Subject: [PATCH 42/50] Added field options for zone create method. --- .../src/main/java/com/google/gcloud/dns/Dns.java | 7 ++++--- .../src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java | 7 +++++-- .../src/main/java/com/google/gcloud/spi/DnsRpc.java | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index af0868ec17d6..f6649c28680c 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -421,14 +421,15 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { * *

Returns {@link ZoneInfo} object representing the new zone's information. In addition to the * name, dns name and description (supplied by the user within the {@code zoneInfo} parameter), - * the returned object will include the following read-only fields supplied by the server: - * creation time, id, and list of name servers. + * the returned object can include the following read-only fields supplied by the server: creation + * time, id, and list of name servers. The returned fields can be optionally restricted by + * specifying {@link ZoneOption}s. * * @throws DnsException upon failure * @see Cloud DNS Managed Zones: * create */ - ZoneInfo create(ZoneInfo zoneInfo); + ZoneInfo create(ZoneInfo zoneInfo, ZoneOption... options); /** * Returns the zone by the specified zone name. Returns {@code null} if the zone is not found. The diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java index 12596da02bf6..6ed9c7e0f216 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java @@ -54,9 +54,12 @@ public DefaultDnsRpc(DnsOptions options) { } @Override - public ManagedZone create(ManagedZone zone) throws DnsException { + public ManagedZone create(ManagedZone zone, Map options) throws DnsException { try { - return dns.managedZones().create(this.options.projectId(), zone).execute(); + return dns.managedZones() + .create(this.options.projectId(), zone) + .setFields(FIELDS.getString(options)) + .execute(); } catch (IOException ex) { throw translate(ex); } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java index c3cd3c690177..addb69d24b40 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java @@ -87,10 +87,11 @@ public String pageToken() { * Creates a new zone. * * @param zone a zone to be created + * @param options a map of options for the service call * @return Updated {@code ManagedZone} object * @throws DnsException upon failure */ - ManagedZone create(ManagedZone zone) throws DnsException; + ManagedZone create(ManagedZone zone, Map options) throws DnsException; /** * Retrieves and returns an existing zone. From 4057dcd93d2dee27c0a7f51e51723ca414daa5fd Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Thu, 4 Feb 2016 18:19:27 -0800 Subject: [PATCH 43/50] Fixed doc after refactoring. Made zone name mandatory in fields. --- .../src/main/java/com/google/gcloud/dns/Dns.java | 4 ++-- .../src/main/java/com/google/gcloud/dns/Zone.java | 15 ++++++--------- .../main/java/com/google/gcloud/dns/ZoneInfo.java | 11 +---------- .../test/java/com/google/gcloud/dns/DnsTest.java | 2 +- 4 files changed, 10 insertions(+), 22 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index f6649c28680c..040a97e5b253 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -68,7 +68,7 @@ static String selector(ProjectField... fields) { * The fields of a zone. * *

These values can be used to specify the fields to include in a partial response when calling - * {@link Dns#getZone(String, ZoneOption...)}. The ID is always returned, even if not specified. + * {@link Dns#getZone(String, ZoneOption...)}. The name is always returned, even if not specified. */ enum ZoneField { CREATION_TIME("creationTime"), @@ -91,7 +91,7 @@ String selector() { static String selector(ZoneField... fields) { Set fieldStrings = Sets.newHashSetWithExpectedSize(fields.length + 1); - fieldStrings.add(ZONE_ID.selector()); + fieldStrings.add(NAME.selector()); for (ZoneField field : fields) { fieldStrings.add(field.selector()); } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java index 04edf332115d..f5e0a8b4a63b 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -78,7 +78,7 @@ public Zone reload(Dns.ZoneOption... options) { } /** - * Deletes the zone. The method first deletes the zone by name which must always be initialized. + * Deletes the zone. The method deletes the zone by name. * * @return {@code true} is zone was found and deleted and {@code false} otherwise * @throws DnsException upon failure @@ -88,8 +88,7 @@ public boolean delete() { } /** - * Lists all {@link DnsRecord}s associated with this zone. The method searches for zone by name - * which must always be initialized. + * Lists all {@link DnsRecord}s associated with this zone. The method searches for zone by name. * * @param options optional restriction on listing and fields of {@link DnsRecord}s returned * @return a page of DNS records @@ -115,14 +114,13 @@ public ChangeRequest applyChangeRequest(ChangeRequest changeRequest, /** * Retrieves an updated information about a change request previously submitted to be applied to - * this zone. The method searches for zone by name which must always be initialized. Returns a - * {@link ChangeRequest} if and {@code null} if the change request was not found. Throws {@link - * DnsException} if the zone is not found. + * this zone. Returns a {@link ChangeRequest} or {@code null} if the change request was not + * found. Throws {@link DnsException} if the zone is not found. * * @param options optional restriction on what fields of {@link ChangeRequest} should be returned * @return updated ChangeRequest * @throws DnsException upon failure or if the zone is not found - * @throws NullPointerException if the change request does not have initialized id + * @throws NullPointerException if {@code changeRequestId} is null */ public ChangeRequest getChangeRequest(String changeRequestId, Dns.ChangeRequestOption... options) { @@ -132,8 +130,7 @@ public ChangeRequest getChangeRequest(String changeRequestId, /** * Retrieves all change requests for this zone. The method searches for zone by name which must - * always be initialized. Returns a page of {@link ChangeRequest}s. Throws a {@link DnsException} - * if the zone is not found. + * always be initialized. Returns a page of {@link ChangeRequest}s. * * @param options optional restriction on listing and fields to be returned * @return a page of change requests diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java index 09945fb72138..a15518ae166f 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java @@ -60,12 +60,6 @@ public static class Builder { private String nameServerSet; private List nameServers = new LinkedList<>(); - /** - * Returns an empty builder for {@code ZoneInfo}. We use it internally in {@code toPb()}. - */ - private Builder() { - } - private Builder(String name) { this.name = checkNotNull(name); } @@ -246,7 +240,7 @@ com.google.api.services.dns.model.ManagedZone toPb() { } static ZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) { - Builder builder = new Builder(); + Builder builder = new Builder(pb.getName()); if (pb.getDescription() != null) { builder.description(pb.getDescription()); } @@ -256,9 +250,6 @@ static ZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) { if (pb.getId() != null) { builder.id(pb.getId().toString()); } - if (pb.getName() != null) { - builder.name(pb.getName()); - } if (pb.getNameServers() != null) { builder.nameServers(pb.getNameServers()); } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java index c2be251cea9e..74faca329884 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java @@ -80,7 +80,7 @@ public void testZoneList() { assertTrue(fields.value() instanceof String); assertTrue(((String) fields.value()).contains(Dns.ZoneField.CREATION_TIME.selector())); assertTrue(((String) fields.value()).contains(Dns.ZoneField.DESCRIPTION.selector())); - assertTrue(((String) fields.value()).contains(Dns.ZoneField.ZONE_ID.selector())); + assertTrue(((String) fields.value()).contains(Dns.ZoneField.NAME.selector())); // page token Dns.ZoneListOption option = Dns.ZoneListOption.pageToken(PAGE_TOKEN); assertEquals(PAGE_TOKEN, option.value()); From d7226350faa112b2f2e5310e7268ba61176729ee Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Fri, 5 Feb 2016 08:45:53 -0800 Subject: [PATCH 44/50] Javadoc fixed. --- .../src/main/java/com/google/gcloud/dns/Zone.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java index f5e0a8b4a63b..3f4ea8cab3e4 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -66,8 +66,7 @@ public static Zone get(Dns dnsService, String zoneName, Dns.ZoneOption... option } /** - * Retrieves the latest information about the zone. The method retrieves the zone by name which - * must always be initialized. + * Retrieves the latest information about the zone. The method retrieves the zone by name. * * @param options optional restriction on what fields should be fetched * @return zone object containing updated information or {@code null} if not not found @@ -100,7 +99,7 @@ public Page listDnsRecords(Dns.DnsRecordListOption... options) { /** * Submits {@link ChangeRequest} to the service for it to applied to this zone. The method - * searches for zone by name which must always be initialized. + * searches for zone by name. * * @param options optional restriction on what fields of {@link ChangeRequest} should be returned * @return ChangeRequest with server-assigned ID @@ -114,8 +113,8 @@ public ChangeRequest applyChangeRequest(ChangeRequest changeRequest, /** * Retrieves an updated information about a change request previously submitted to be applied to - * this zone. Returns a {@link ChangeRequest} or {@code null} if the change request was not - * found. Throws {@link DnsException} if the zone is not found. + * this zone. Returns a {@link ChangeRequest} or {@code null} if the change request was not found. + * Throws {@link DnsException} if the zone is not found. * * @param options optional restriction on what fields of {@link ChangeRequest} should be returned * @return updated ChangeRequest @@ -129,8 +128,8 @@ public ChangeRequest getChangeRequest(String changeRequestId, } /** - * Retrieves all change requests for this zone. The method searches for zone by name which must - * always be initialized. Returns a page of {@link ChangeRequest}s. + * Retrieves all change requests for this zone. The method searches for zone by name. Returns a + * page of {@link ChangeRequest}s. * * @param options optional restriction on listing and fields to be returned * @return a page of change requests From 5be58b3e91cade1d349014122484a29e254ba8f3 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Sun, 7 Feb 2016 14:01:52 -0800 Subject: [PATCH 45/50] Makes Zone subclass of ZoneInfo. Fixes #605. --- .../main/java/com/google/gcloud/dns/Dns.java | 2 +- .../main/java/com/google/gcloud/dns/Zone.java | 121 ++++++++++++++---- .../java/com/google/gcloud/dns/ZoneInfo.java | 98 ++++++++------ .../java/com/google/gcloud/dns/ZoneTest.java | 61 +++++++-- 4 files changed, 209 insertions(+), 73 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 040a97e5b253..3ea505b5e09b 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -439,7 +439,7 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { * @see Cloud DNS Managed Zones: * get */ - ZoneInfo getZone(String zoneName, ZoneOption... options); + Zone getZone(String zoneName, ZoneOption... options); /** * Lists the zones inside the project. diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java index 3f4ea8cab3e4..2da67a8e9a01 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -20,7 +20,8 @@ import com.google.gcloud.Page; -import java.io.Serializable; +import java.util.List; +import java.util.Objects; /** * A Google Cloud DNS Zone object. @@ -33,20 +34,87 @@ * @see Google Cloud DNS managed zone * documentation */ -public class Zone implements Serializable { +public class Zone extends ZoneInfo { - // TODO(mderka) Zone and zoneInfo to be merged. Opened issue #605. + private static final long serialVersionUID = 564454483894599281L; + private transient Dns dns; - private static final long serialVersionUID = 6847890192129375500L; - private final ZoneInfo zoneInfo; - private final Dns dns; + /** + * Builder for {@code Zone}. + */ + public static class Builder extends ZoneInfo.Builder { + private final Dns dns; + private final ZoneInfo.BuilderImpl infoBuilder; + + private Builder(Zone zone) { + this.dns = zone.dns; + this.infoBuilder = new ZoneInfo.BuilderImpl(zone); + } + + @Override + public Builder name(String name) { + infoBuilder.name(name); + return this; + } + + @Override + Builder id(String id) { + infoBuilder.id(id); + return this; + } + + @Override + Builder creationTimeMillis(long creationTimeMillis) { + infoBuilder.creationTimeMillis(creationTimeMillis); + return this; + } + + @Override + public Builder dnsName(String dnsName) { + infoBuilder.dnsName(dnsName); + return this; + } + + @Override + public Builder description(String description) { + infoBuilder.description(description); + return this; + } + + @Override + public Builder nameServerSet(String nameServerSet) { + infoBuilder.nameServerSet(nameServerSet); + return this; + } + + @Override + Builder nameServers(List nameServers) { + infoBuilder.nameServers(nameServers); // infoBuilder makes a copy + return this; + } + + @Override + public Zone build() { + return new Zone(dns, infoBuilder); + } + } + + Zone(Dns dns, ZoneInfo.BuilderImpl infoBuilder) { + super(infoBuilder); + this.dns = dns; + } + + @Override + public Builder toBuilder() { + return new Builder(this); + } /** * Constructs a {@code Zone} object that contains the given {@code zoneInfo}. */ public Zone(Dns dns, ZoneInfo zoneInfo) { - this.zoneInfo = checkNotNull(zoneInfo); - this.dns = checkNotNull(dns); + super(new BuilderImpl(zoneInfo)); + this.dns = dns; } /** @@ -61,8 +129,7 @@ public Zone(Dns dns, ZoneInfo zoneInfo) { public static Zone get(Dns dnsService, String zoneName, Dns.ZoneOption... options) { checkNotNull(zoneName); checkNotNull(dnsService); - ZoneInfo zoneInfo = dnsService.getZone(zoneName, options); - return zoneInfo == null ? null : new Zone(dnsService, zoneInfo); + return dnsService.getZone(zoneName, options); } /** @@ -73,7 +140,7 @@ public static Zone get(Dns dnsService, String zoneName, Dns.ZoneOption... option * @throws DnsException upon failure */ public Zone reload(Dns.ZoneOption... options) { - return Zone.get(dns, zoneInfo.name(), options); + return dns.getZone(name(), options); } /** @@ -83,7 +150,7 @@ public Zone reload(Dns.ZoneOption... options) { * @throws DnsException upon failure */ public boolean delete() { - return dns.delete(zoneInfo.name()); + return dns.delete(name()); } /** @@ -94,7 +161,7 @@ public boolean delete() { * @throws DnsException upon failure or if the zone is not found */ public Page listDnsRecords(Dns.DnsRecordListOption... options) { - return dns.listDnsRecords(zoneInfo.name(), options); + return dns.listDnsRecords(name(), options); } /** @@ -108,7 +175,7 @@ public Page listDnsRecords(Dns.DnsRecordListOption... options) { public ChangeRequest applyChangeRequest(ChangeRequest changeRequest, Dns.ChangeRequestOption... options) { checkNotNull(changeRequest); - return dns.applyChangeRequest(zoneInfo.name(), changeRequest, options); + return dns.applyChangeRequest(name(), changeRequest, options); } /** @@ -124,7 +191,7 @@ public ChangeRequest applyChangeRequest(ChangeRequest changeRequest, public ChangeRequest getChangeRequest(String changeRequestId, Dns.ChangeRequestOption... options) { checkNotNull(changeRequestId); - return dns.getChangeRequest(zoneInfo.name(), changeRequestId, options); + return dns.getChangeRequest(name(), changeRequestId, options); } /** @@ -136,14 +203,7 @@ public ChangeRequest getChangeRequest(String changeRequestId, * @throws DnsException upon failure or if the zone is not found */ public Page listChangeRequests(Dns.ChangeRequestListOption... options) { - return dns.listChangeRequests(zoneInfo.name(), options); - } - - /** - * Returns the {@link ZoneInfo} object containing information about this zone. - */ - public ZoneInfo info() { - return zoneInfo; + return dns.listChangeRequests(name(), options); } /** @@ -152,4 +212,19 @@ public ZoneInfo info() { public Dns dns() { return this.dns; } + + @Override + public boolean equals(Object obj) { + return obj instanceof Zone && Objects.equals(toPb(), ((Zone) obj).toPb()); + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + static Zone fromPb(Dns dns, com.google.api.services.dns.model.ManagedZone zone) { + ZoneInfo info = ZoneInfo.fromPb(zone); + return new Zone(dns, info); + } } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java index a15518ae166f..e397e37a7fbf 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java @@ -49,9 +49,55 @@ public class ZoneInfo implements Serializable { private final List nameServers; /** - * A builder for {@code ZoneInfo}. + * Builder for {@code ZoneInfo}. */ - public static class Builder { + public abstract static class Builder { + /** + * Sets a mandatory user-provided name for the zone. It must be unique within the project. + */ + public abstract Builder name(String name); + + /** + * Sets an id for the zone which is assigned to the zone by the server. + */ + abstract Builder id(String id); + + /** + * Sets the time when this zone was created. + */ + abstract Builder creationTimeMillis(long creationTimeMillis); + + /** + * Sets a mandatory DNS name of this zone, for instance "example.com.". + */ + public abstract Builder dnsName(String dnsName); + + /** + * Sets a mandatory description for this zone. The value is a string of at most 1024 characters + * which has no effect on the zone's function. + */ + public abstract Builder description(String description); + + /** + * Optionally specifies the NameServerSet for this zone. A NameServerSet is a set of DNS name + * servers that all host the same zones. Most users will not need to specify this value. + */ + public abstract Builder nameServerSet(String nameServerSet); + // todo(mderka) add more to the doc when questions are answered by the service owner + + /** + * Sets a list of servers that hold the information about the zone. This information is provided + * by Google Cloud DNS and is read only. + */ + abstract Builder nameServers(List nameServers); + + /** + * Builds the instance of {@code ZoneInfo} based on the information set by this builder. + */ + public abstract ZoneInfo build(); + } + + public static class BuilderImpl extends Builder { private String name; private String id; private Long creationTimeMillis; @@ -60,14 +106,14 @@ public static class Builder { private String nameServerSet; private List nameServers = new LinkedList<>(); - private Builder(String name) { + private BuilderImpl(String name) { this.name = checkNotNull(name); } /** * Creates a builder from an existing ZoneInfo object. */ - Builder(ZoneInfo info) { + BuilderImpl(ZoneInfo info) { this.name = info.name; this.id = info.id; this.creationTimeMillis = info.creationTimeMillis; @@ -77,76 +123,56 @@ private Builder(String name) { this.nameServers.addAll(info.nameServers); } - /** - * Sets a mandatory user-provided name for the zone. It must be unique within the project. - */ + @Override public Builder name(String name) { this.name = checkNotNull(name); return this; } - /** - * Sets an id for the zone which is assigned to the zone by the server. - */ + @Override Builder id(String id) { this.id = id; return this; } - /** - * Sets the time when this zone was created. - */ + @Override Builder creationTimeMillis(long creationTimeMillis) { this.creationTimeMillis = creationTimeMillis; return this; } - /** - * Sets a mandatory DNS name of this zone, for instance "example.com.". - */ + @Override public Builder dnsName(String dnsName) { this.dnsName = checkNotNull(dnsName); return this; } - /** - * Sets a mandatory description for this zone. The value is a string of at most 1024 characters - * which has no effect on the zone's function. - */ + @Override public Builder description(String description) { this.description = checkNotNull(description); return this; } - /** - * Optionally specifies the NameServerSet for this zone. A NameServerSet is a set of DNS name - * servers that all host the same zones. Most users will not need to specify this value. - */ + @Override public Builder nameServerSet(String nameServerSet) { - // todo(mderka) add more to the doc when questions are answered by the service owner this.nameServerSet = checkNotNull(nameServerSet); return this; } - /** - * Sets a list of servers that hold the information about the zone. This information is provided - * by Google Cloud DNS and is read only. - */ + @Override Builder nameServers(List nameServers) { checkNotNull(nameServers); this.nameServers = Lists.newLinkedList(nameServers); return this; } - /** - * Builds the instance of {@code ZoneInfo} based on the information set by this builder. - */ + @Override public ZoneInfo build() { return new ZoneInfo(this); } } - private ZoneInfo(Builder builder) { + ZoneInfo(BuilderImpl builder) { this.name = builder.name; this.id = builder.id; this.creationTimeMillis = builder.creationTimeMillis; @@ -160,7 +186,7 @@ private ZoneInfo(Builder builder) { * Returns a builder for {@code ZoneInfo} with an assigned {@code name}. */ public static Builder builder(String name) { - return new Builder(name); + return new BuilderImpl(name); } /** @@ -217,7 +243,7 @@ public List nameServers() { * Returns a builder for {@code ZoneInfo} prepopulated with the metadata of this zone. */ public Builder toBuilder() { - return new Builder(this); + return new BuilderImpl(this); } com.google.api.services.dns.model.ManagedZone toPb() { @@ -240,7 +266,7 @@ com.google.api.services.dns.model.ManagedZone toPb() { } static ZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) { - Builder builder = new Builder(pb.getName()); + Builder builder = new BuilderImpl(pb.getName()); if (pb.getDescription() != null) { builder.description(pb.getDescription()); } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java index 59cb642167ed..1b09dca715a4 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java @@ -22,23 +22,27 @@ import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import com.google.common.collect.ImmutableList; import com.google.gcloud.Page; import org.junit.After; import org.junit.Before; import org.junit.Test; +import java.math.BigInteger; + public class ZoneTest { private static final String ZONE_NAME = "dns-zone-name"; private static final String ZONE_ID = "123"; - private static final ZoneInfo ZONE_INFO = ZoneInfo.builder(ZONE_NAME) + private static final ZoneInfo ZONE_INFO = Zone.builder(ZONE_NAME) .id(ZONE_ID) .dnsName("example.com") .creationTimeMillis(123478946464L) @@ -80,20 +84,19 @@ public void tearDown() throws Exception { @Test public void testConstructor() { replay(dns); - assertNotNull(zone.info()); - assertEquals(ZONE_INFO, zone.info()); + assertEquals(ZONE_INFO.toPb(), zone.toPb()); assertNotNull(zone.dns()); assertEquals(dns, zone.dns()); } @Test public void testGetByName() { - expect(dns.getZone(ZONE_NAME)).andReturn(ZONE_INFO); - expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(ZONE_INFO); // for options + expect(dns.getZone(ZONE_NAME)).andReturn(zone); + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zone); // for options replay(dns); Zone retrieved = Zone.get(dns, ZONE_NAME); assertSame(dns, retrieved.dns()); - assertEquals(ZONE_INFO, retrieved.info()); + assertEquals(zone, retrieved); // test passing options Zone.get(dns, ZONE_NAME, ZONE_FIELD_OPTIONS); try { @@ -188,18 +191,18 @@ public void listDnsRecordsByNameAndNotFound() { @Test public void reloadByNameAndFound() { - expect(dns.getZone(ZONE_NAME)).andReturn(zoneNoId.info()); - expect(dns.getZone(ZONE_NAME)).andReturn(zone.info()); + expect(dns.getZone(ZONE_NAME)).andReturn(zone); + expect(dns.getZone(ZONE_NAME)).andReturn(zone); // again for options - expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zoneNoId.info()); - expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zone.info()); + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zoneNoId); + expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zone); replay(dns); Zone result = zoneNoId.reload(); - assertSame(zoneNoId.dns(), result.dns()); - assertEquals(zoneNoId.info(), result.info()); + assertSame(zone.dns(), result.dns()); + assertEquals(zone, result); result = zone.reload(); assertSame(zone.dns(), result.dns()); - assertEquals(zone.info(), result.info()); + assertEquals(zone, result); zoneNoId.reload(ZONE_FIELD_OPTIONS); // check options zone.reload(ZONE_FIELD_OPTIONS); // check options } @@ -499,4 +502,36 @@ public void listChangeRequestsAndZoneNotFound() { // expected } } + + @Test + public void testFromPb() { + replay(dns); + assertEquals(Zone.fromPb(dns, zone.toPb()), zone); + } + + @Test + public void testEqualsAndToBuilder() { + replay(dns); + assertEquals(zone, zone.toBuilder().build()); + } + + @Test + public void testBuilder() { + replay(dns); + assertNotEquals(zone, zone.toBuilder() + .id((new BigInteger(zone.id())).add(BigInteger.ONE).toString()) + .build()); + assertNotEquals(zone, zone.toBuilder().dnsName(zone.name() + "aaaa").build()); + assertNotEquals(zone, zone.toBuilder().nameServerSet(zone.nameServerSet() + "aaaa").build()); + assertNotEquals(zone, zone.toBuilder().nameServers(ImmutableList.of("nameserverpppp")).build()); + assertNotEquals(zone, zone.toBuilder().dnsName(zone.dnsName() + "aaaa").build()); + assertNotEquals(zone, zone.toBuilder().creationTimeMillis(zone.creationTimeMillis() + 1) + .build()); + Zone.Builder builder = zone.toBuilder(); + builder.id(ZONE_ID) + .dnsName("example.com") + .creationTimeMillis(123478946464L) + .build(); + assertEquals(zone, builder.build()); + } } From d1c45124dffd0a5a3bfdc2a4abe5c6483f32c295 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Sun, 7 Feb 2016 10:32:02 -0800 Subject: [PATCH 46/50] Added implementation of Dns and test. Renamed getProjectInfo. Fixed #619. --- .../main/java/com/google/gcloud/dns/Dns.java | 6 +- .../com/google/gcloud/dns/DnsException.java | 18 + .../java/com/google/gcloud/dns/DnsImpl.java | 335 ++++++++++++++++ .../com/google/gcloud/dns/DnsOptions.java | 2 +- .../com/google/gcloud/dns/DnsImplTest.java | 370 ++++++++++++++++++ 5 files changed, 727 insertions(+), 4 deletions(-) create mode 100644 gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java create mode 100644 gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 3ea505b5e09b..88e0d7a08591 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -36,7 +36,7 @@ public interface Dns extends Service { * The fields of a project. * *

These values can be used to specify the fields to include in a partial response when calling - * {@link Dns#getProjectInfo(ProjectOption...)}. Project ID is always returned, even if not + * {@link Dns#getProject(ProjectOption...)}. Project ID is always returned, even if not * specified. */ enum ProjectField { @@ -429,7 +429,7 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { * @see Cloud DNS Managed Zones: * create */ - ZoneInfo create(ZoneInfo zoneInfo, ZoneOption... options); + Zone create(ZoneInfo zoneInfo, ZoneOption... options); /** * Returns the zone by the specified zone name. Returns {@code null} if the zone is not found. The @@ -485,7 +485,7 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { * @throws DnsException upon failure * @see Cloud DNS Projects: get */ - ProjectInfo getProjectInfo(ProjectOption... fields); + ProjectInfo getProject(ProjectOption... fields); /** * Submits a change request for the specified zone. The returned object contains the following diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java index 73c546759260..2092d5909d37 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java @@ -17,6 +17,8 @@ package com.google.gcloud.dns; import com.google.gcloud.BaseServiceException; +import com.google.gcloud.RetryHelper.RetryHelperException; +import com.google.gcloud.RetryHelper.RetryInterruptedException; import java.io.IOException; @@ -31,5 +33,21 @@ public DnsException(IOException exception) { super(exception, true); } + public DnsException(int code, String message) { + super(code, message, null, true); + } + + /** + * Translate RetryHelperException to the DnsException that caused the error. This method will + * always throw an exception. + * + * @throws DnsException when {@code ex} was caused by a {@code DnsException} + * @throws RetryInterruptedException when {@code ex} is a {@code RetryInterruptedException} + */ + static DnsException translateAndThrow(RetryHelperException ex) { + BaseServiceException.translateAndPropagateIfPossible(ex); + throw new DnsException(UNKNOWN_CODE, ex.getMessage()); + } + //TODO(mderka) Add translation and retry functionality. Created issue #593. } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java new file mode 100644 index 000000000000..b3ae73fd7e93 --- /dev/null +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java @@ -0,0 +1,335 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.gcloud.RetryHelper.RetryHelperException; +import static com.google.gcloud.RetryHelper.runWithRetries; +import static com.google.gcloud.dns.ChangeRequest.fromPb; + +import com.google.api.services.dns.model.Change; +import com.google.api.services.dns.model.ManagedZone; +import com.google.api.services.dns.model.ResourceRecordSet; +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; +import com.google.gcloud.BaseService; +import com.google.gcloud.Page; +import com.google.gcloud.PageImpl; +import com.google.gcloud.RetryHelper; +import com.google.gcloud.spi.DnsRpc; + +import java.util.Map; +import java.util.concurrent.Callable; + +/** + * A default implementation of Dns. + */ +final class DnsImpl extends BaseService implements Dns { + + private final DnsRpc dnsRpc; + + private static class ZonePageFetcher implements PageImpl.NextPageFetcher { + + private static final long serialVersionUID = 2158209410430566961L; + private final Map requestOptions; + private final DnsOptions serviceOptions; + + ZonePageFetcher(DnsOptions serviceOptions, String cursor, + Map optionMap) { + this.requestOptions = + PageImpl.nextRequestOptions(DnsRpc.Option.PAGE_TOKEN, cursor, optionMap); + this.serviceOptions = serviceOptions; + } + + @Override + public Page nextPage() { + return listZones(serviceOptions, requestOptions); + } + } + + private static class ChangeRequestPageFetcher implements PageImpl.NextPageFetcher { + + private static final Function PB_TO_CHANGE_REQUEST = + new Function() { + @Override + public ChangeRequest apply(com.google.api.services.dns.model.Change changePb) { + return fromPb(changePb); + } + }; + private static final long serialVersionUID = -8737501076674042014L; + private final String zoneName; + private final Map requestOptions; + private final DnsOptions serviceOptions; + + ChangeRequestPageFetcher(String zoneName, DnsOptions serviceOptions, String cursor, + Map optionMap) { + this.zoneName = zoneName; + this.requestOptions = + PageImpl.nextRequestOptions(DnsRpc.Option.PAGE_TOKEN, cursor, optionMap); + this.serviceOptions = serviceOptions; + } + + @Override + public Page nextPage() { + return listChangeRequests(zoneName, serviceOptions, requestOptions, PB_TO_CHANGE_REQUEST); + } + } + + private static class DnsRecordPageFetcher implements PageImpl.NextPageFetcher { + + private static final Function PB_TO_DNS_RECORD = + new Function() { + @Override + public DnsRecord apply(com.google.api.services.dns.model.ResourceRecordSet pb) { + return DnsRecord.fromPb(pb); + } + }; + private static final long serialVersionUID = 670996349097667660L; + private final Map requestOptions; + private final DnsOptions serviceOptions; + private final String zoneName; + + DnsRecordPageFetcher(String zoneName, DnsOptions serviceOptions, String cursor, + Map optionMap) { + this.zoneName = zoneName; + this.requestOptions = + PageImpl.nextRequestOptions(DnsRpc.Option.PAGE_TOKEN, cursor, optionMap); + this.serviceOptions = serviceOptions; + } + + @Override + public Page nextPage() { + return listDnsRecords(zoneName, serviceOptions, requestOptions, PB_TO_DNS_RECORD); + } + } + + private static Page listZones(final DnsOptions serviceOptions, + final Map optionsMap) { + // define transformation function + // this differs from the other list operations since zone is functional and requires dns service + Function pbToZoneFunction = new Function() { + @Override + public Zone apply( + com.google.api.services.dns.model.ManagedZone zonePb) { + return new Zone(serviceOptions.service(), ZoneInfo.fromPb(zonePb)); + } + }; + try { + // get a list of managed zones + DnsRpc.ListResult result = + runWithRetries(new Callable>() { + @Override + public DnsRpc.ListResult call() { + return serviceOptions.rpc().listZones(optionsMap); + } + }, serviceOptions.retryParams(), EXCEPTION_HANDLER); + String cursor = result.pageToken(); + // transform that list into zone objects + Iterable zones = result.results() == null + ? ImmutableList.of() : Iterables.transform(result.results(), pbToZoneFunction); + return new PageImpl<>(new ZonePageFetcher(serviceOptions, cursor, optionsMap), + cursor, zones); + } catch (RetryHelperException e) { + throw DnsException.translateAndThrow(e); + } + } + + private static Page listChangeRequests(final String zoneName, + final DnsOptions serviceOptions, final Map optionsMap, + Function TRANSFORM_FUNCTION) { + try { + // get a list of changes + DnsRpc.ListResult result = runWithRetries(new Callable>() { + @Override + public DnsRpc.ListResult call() { + return serviceOptions.rpc().listChangeRequests(zoneName, optionsMap); + } + }, serviceOptions.retryParams(), EXCEPTION_HANDLER); + String cursor = result.pageToken(); + // transform that list into change request objects + Iterable changes = result.results() == null + ? ImmutableList.of() + : Iterables.transform(result.results(), TRANSFORM_FUNCTION); + return new PageImpl<>(new ChangeRequestPageFetcher(zoneName, serviceOptions, cursor, + optionsMap), cursor, changes); + } catch (RetryHelperException e) { + throw DnsException.translateAndThrow(e); + } + } + + private static Page listDnsRecords(final String zoneName, + final DnsOptions serviceOptions, final Map optionsMap, + Function TRANSFORM_FUNCTION) { + try { + // get a list of resource record sets + DnsRpc.ListResult result = runWithRetries( + new Callable>() { + @Override + public DnsRpc.ListResult call() { + return serviceOptions.rpc().listDnsRecords(zoneName, optionsMap); + } + }, serviceOptions.retryParams(), EXCEPTION_HANDLER); + String cursor = result.pageToken(); + // transform that list into dns records + Iterable records = result.results() == null + ? ImmutableList.of() + : Iterables.transform(result.results(), TRANSFORM_FUNCTION); + return new PageImpl<>(new DnsRecordPageFetcher(zoneName, serviceOptions, cursor, optionsMap), + cursor, records); + } catch (RetryHelperException e) { + throw DnsException.translateAndThrow(e); + } + } + + DnsImpl(DnsOptions options) { + super(options); + dnsRpc = options.rpc(); + } + + @Override + public Page listZones(ZoneListOption... options) { + return listZones(options(), optionMap(options)); + } + + @Override + public Page listChangeRequests(String zoneName, + ChangeRequestListOption... options) { + return listChangeRequests(zoneName, options(), optionMap(options), + ChangeRequestPageFetcher.PB_TO_CHANGE_REQUEST); + } + + @Override + public Page listDnsRecords(String zoneName, DnsRecordListOption... options) { + return listDnsRecords(zoneName, options(), optionMap(options), + DnsRecordPageFetcher.PB_TO_DNS_RECORD); + } + + @Override + public Zone create(final ZoneInfo zoneInfo, Dns.ZoneOption... options) { + final Map optionsMap = optionMap(options); + try { + com.google.api.services.dns.model.ManagedZone answer = runWithRetries( + new Callable() { + @Override + public com.google.api.services.dns.model.ManagedZone call() { + return dnsRpc.create(zoneInfo.toPb(), optionsMap); + } + }, options().retryParams(), EXCEPTION_HANDLER); + return answer == null ? null : Zone.fromPb(this, answer); + } catch (RetryHelper.RetryHelperException ex) { + throw DnsException.translateAndThrow(ex); + } + } + + @Override + public Zone getZone(final String zoneName, Dns.ZoneOption... options) { + final Map optionsMap = optionMap(options); + try { + com.google.api.services.dns.model.ManagedZone answer = runWithRetries( + new Callable() { + @Override + public com.google.api.services.dns.model.ManagedZone call() { + return dnsRpc.getZone(zoneName, optionsMap); + } + }, options().retryParams(), EXCEPTION_HANDLER); + return answer == null ? null : Zone.fromPb(this, answer); + } catch (RetryHelper.RetryHelperException ex) { + throw DnsException.translateAndThrow(ex); + } + } + + @Override + public boolean delete(final String zoneName) { + try { + return runWithRetries(new Callable() { + @Override + public Boolean call() { + return dnsRpc.deleteZone(zoneName); + } + }, options().retryParams(), EXCEPTION_HANDLER); + } catch (RetryHelper.RetryHelperException ex) { + throw DnsException.translateAndThrow(ex); + } + } + + @Override + public ProjectInfo getProject(Dns.ProjectOption... fields) { + final Map optionsMap = optionMap(fields); + try { + com.google.api.services.dns.model.Project answer = runWithRetries( + new Callable() { + @Override + public com.google.api.services.dns.model.Project call() { + return dnsRpc.getProject(optionsMap); + } + }, options().retryParams(), EXCEPTION_HANDLER); + return answer == null ? null : ProjectInfo.fromPb(answer); // should never be null + } catch (RetryHelper.RetryHelperException ex) { + throw DnsException.translateAndThrow(ex); + } + } + + @Override + public ChangeRequest applyChangeRequest(final String zoneName, final ChangeRequest changeRequest, + Dns.ChangeRequestOption... options) { + final Map optionsMap = optionMap(options); + try { + com.google.api.services.dns.model.Change answer = + runWithRetries( + new Callable() { + @Override + public com.google.api.services.dns.model.Change call() { + return dnsRpc.applyChangeRequest(zoneName, changeRequest.toPb(), optionsMap); + } + }, options().retryParams(), EXCEPTION_HANDLER); + return answer == null ? null : fromPb(answer); // should never be null + } catch (RetryHelper.RetryHelperException ex) { + throw DnsException.translateAndThrow(ex); + } + } + + @Override + public ChangeRequest getChangeRequest(final String zoneName, final String changeRequestId, + Dns.ChangeRequestOption... options) { + final Map optionsMap = optionMap(options); + try { + com.google.api.services.dns.model.Change answer = + runWithRetries( + new Callable() { + @Override + public com.google.api.services.dns.model.Change call() { + return dnsRpc.getChangeRequest(zoneName, changeRequestId, optionsMap); + } + }, options().retryParams(), EXCEPTION_HANDLER); + return answer == null ? null : fromPb(answer); // should never be null + } catch (RetryHelper.RetryHelperException ex) { + throw DnsException.translateAndThrow(ex); + } + } + + private Map optionMap(AbstractOption... options) { + Map temp = Maps.newEnumMap(DnsRpc.Option.class); + for (AbstractOption option : options) { + Object prev = temp.put(option.rpcOption(), option.value()); + checkArgument(prev == null, "Duplicate option %s", option); + } + return ImmutableMap.copyOf(temp); + } +} diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java index 248fd164a55f..1ce4425366e5 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java @@ -37,7 +37,7 @@ public static class DefaultDnsFactory implements DnsFactory { @Override public Dns create(DnsOptions options) { // TODO(mderka) Implement when DnsImpl is available. Created issue #595. - return null; + return new DnsImpl(options); } } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java new file mode 100644 index 000000000000..8e063c9bb096 --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java @@ -0,0 +1,370 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import com.google.api.services.dns.model.Change; +import com.google.api.services.dns.model.ManagedZone; +import com.google.api.services.dns.model.ResourceRecordSet; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.gcloud.Page; +import com.google.gcloud.RetryParams; +import com.google.gcloud.ServiceOptions; +import com.google.gcloud.spi.DnsRpc; +import com.google.gcloud.spi.DnsRpcFactory; + +import org.easymock.Capture; +import org.easymock.EasyMock; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Map; + +public class DnsImplTest { + + // Dns entities + private static final String ZONE_NAME = "some zone name"; + private static final String DNS_NAME = "example.com."; + private static final String CHANGE_ID = "some change id"; + private static final DnsRecord DNS_RECORD1 = DnsRecord.builder("Something", DnsRecord.Type.AAAA) + .build(); + private static final DnsRecord DNS_RECORD2 = DnsRecord.builder("Different", DnsRecord.Type.AAAA) + .build(); + private static final Integer MAX_SIZE = 20; + private static final String PAGE_TOKEN = "some token"; + private static final ZoneInfo ZONE_INFO = ZoneInfo.builder(ZONE_NAME).build(); + private static final ProjectInfo PROJECT_INFO = ProjectInfo.builder().build(); + private static final ChangeRequest CHANGE_REQUEST_PARTIAL = ChangeRequest.builder() + .add(DNS_RECORD1) + .build(); + private static final ChangeRequest CHANGE_REQUEST_COMPLETE = ChangeRequest.builder() + .add(DNS_RECORD1) + .startTimeMillis(123L) + .status(ChangeRequest.Status.PENDING) + .id(CHANGE_ID) + .build(); + + // Result lists + private static final DnsRpc.ListResult LIST_RESULT_OF_PB_CHANGES = + DnsRpc.ListResult.of("cursor", ImmutableList.of(CHANGE_REQUEST_COMPLETE.toPb(), + CHANGE_REQUEST_PARTIAL.toPb())); + private static final DnsRpc.ListResult LIST_RESULT_OF_PB_ZONES = + DnsRpc.ListResult.of("cursor", ImmutableList.of(ZONE_INFO.toPb())); + private static final DnsRpc.ListResult LIST_OF_PB_DNS_RECORDS = + DnsRpc.ListResult.of("cursor", ImmutableList.of(DNS_RECORD1.toPb(), DNS_RECORD2.toPb())); + + // Field options + private static final Dns.ZoneOption ZONE_FIELDS = + Dns.ZoneOption.fields(Dns.ZoneField.CREATION_TIME); + private static final Dns.ProjectOption PROJECT_FIELDS = + Dns.ProjectOption.fields(Dns.ProjectField.QUOTA); + private static final Dns.ChangeRequestOption CHANGE_GET_FIELDS = + Dns.ChangeRequestOption.fields(Dns.ChangeRequestField.STATUS); + + // Listing options + private static final Dns.ZoneListOption[] ZONE_LIST_OPTIONS = + {Dns.ZoneListOption.pageSize(MAX_SIZE), Dns.ZoneListOption.pageToken(PAGE_TOKEN), + Dns.ZoneListOption.fields(Dns.ZoneField.DESCRIPTION)}; + private static final Dns.ChangeRequestListOption[] CHANGE_LIST_OPTIONS = + {Dns.ChangeRequestListOption.pageSize(MAX_SIZE), + Dns.ChangeRequestListOption.pageToken(PAGE_TOKEN), + Dns.ChangeRequestListOption.fields(Dns.ChangeRequestField.STATUS), + Dns.ChangeRequestListOption.sortOrder(Dns.SortingOrder.ASCENDING)}; + private static final Dns.DnsRecordListOption[] DNS_RECORD_LIST_OPTIONS = + {Dns.DnsRecordListOption.pageSize(MAX_SIZE), + Dns.DnsRecordListOption.pageToken(PAGE_TOKEN), + Dns.DnsRecordListOption.fields(Dns.DnsRecordField.TTL), + Dns.DnsRecordListOption.dnsName(DNS_NAME), + Dns.DnsRecordListOption.type(DnsRecord.Type.AAAA)}; + + // Other + private static final Map EMPTY_RPC_OPTIONS = ImmutableMap.of(); + private static final ServiceOptions.Clock TIME_SOURCE = new ServiceOptions.Clock() { + @Override + public long millis() { + return 42000L; + } + }; + + private DnsOptions options; + private DnsRpcFactory rpcFactoryMock; + private DnsRpc dnsRpcMock; + private Dns dns; + + @Before + public void setUp() { + rpcFactoryMock = EasyMock.createMock(DnsRpcFactory.class); + dnsRpcMock = EasyMock.createMock(DnsRpc.class); + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(DnsOptions.class))) + .andReturn(dnsRpcMock); + EasyMock.replay(rpcFactoryMock); + options = DnsOptions.builder() + .projectId("projectId") + .clock(TIME_SOURCE) + .serviceRpcFactory(rpcFactoryMock) + .retryParams(RetryParams.noRetries()) + .build(); + } + + @After + public void tearDown() throws Exception { + EasyMock.verify(rpcFactoryMock); + } + + @Test + public void testCreateZone() { + EasyMock.expect(dnsRpcMock.create(ZONE_INFO.toPb(), EMPTY_RPC_OPTIONS)) + .andReturn(ZONE_INFO.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + ZoneInfo zoneInfo = dns.create(ZONE_INFO); + assertEquals(ZONE_INFO, zoneInfo); + } + + @Test + public void testCreateZoneWithOptions() { + Capture> capturedOptions = Capture.newInstance(); + EasyMock.expect(dnsRpcMock.create(EasyMock.eq(ZONE_INFO.toPb()), + EasyMock.capture(capturedOptions))).andReturn(ZONE_INFO.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + Zone zone = dns.create(ZONE_INFO, ZONE_FIELDS); + String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.rpcOption()); + assertEquals(ZONE_INFO, zone); + assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.selector())); + assertTrue(selector.contains(Dns.ZoneField.NAME.selector())); + } + + @Test + public void testGetZone() { + EasyMock.expect(dnsRpcMock.getZone(ZONE_INFO.name(), EMPTY_RPC_OPTIONS)) + .andReturn(ZONE_INFO.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + ZoneInfo zoneInfo = dns.getZone(ZONE_INFO.name()); + assertEquals(ZONE_INFO, zoneInfo); + } + + @Test + public void testGetZoneWithOptions() { + Capture> capturedOptions = Capture.newInstance(); + EasyMock.expect(dnsRpcMock.getZone(EasyMock.eq(ZONE_INFO.name()), + EasyMock.capture(capturedOptions))).andReturn(ZONE_INFO.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + ZoneInfo zoneInfo = dns.getZone(ZONE_INFO.name(), ZONE_FIELDS); + String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.rpcOption()); + assertEquals(ZONE_INFO, zoneInfo); + assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.selector())); + assertTrue(selector.contains(Dns.ZoneField.NAME.selector())); + } + + @Test + public void testDeleteZone() { + EasyMock.expect(dnsRpcMock.deleteZone(ZONE_INFO.name())) + .andReturn(true); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + assertTrue(dns.delete(ZONE_INFO.name())); + } + + @Test + public void testGetProject() { + EasyMock.expect(dnsRpcMock.getProject(EMPTY_RPC_OPTIONS)) + .andReturn(PROJECT_INFO.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + ProjectInfo projectInfo = dns.getProject(); + assertEquals(PROJECT_INFO, projectInfo); + } + + @Test + public void testProjectGetWithOptions() { + Capture> capturedOptions = Capture.newInstance(); + EasyMock.expect(dnsRpcMock.getProject(EasyMock.capture(capturedOptions))) + .andReturn(PROJECT_INFO.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + ProjectInfo projectInfo = dns.getProject(PROJECT_FIELDS); + String selector = (String) capturedOptions.getValue().get(PROJECT_FIELDS.rpcOption()); + assertEquals(PROJECT_INFO, projectInfo); + assertTrue(selector.contains(Dns.ProjectField.QUOTA.selector())); + assertTrue(selector.contains(Dns.ProjectField.PROJECT_ID.selector())); + } + + @Test + public void testGetChangeRequest() { + EasyMock.expect(dnsRpcMock.getChangeRequest(ZONE_INFO.name(), CHANGE_REQUEST_COMPLETE.id(), + EMPTY_RPC_OPTIONS)).andReturn(CHANGE_REQUEST_COMPLETE.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + ChangeRequest changeRequest = dns.getChangeRequest(ZONE_INFO.name(), + CHANGE_REQUEST_COMPLETE.id()); + assertEquals(CHANGE_REQUEST_COMPLETE, changeRequest); + } + + @Test + public void testGetChangeRequestWithOptions() { + Capture> capturedOptions = Capture.newInstance(); + EasyMock.expect(dnsRpcMock.getChangeRequest(EasyMock.eq(ZONE_INFO.name()), + EasyMock.eq(CHANGE_REQUEST_COMPLETE.id()), EasyMock.capture(capturedOptions))) + .andReturn(CHANGE_REQUEST_COMPLETE.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + ChangeRequest changeRequest = dns.getChangeRequest(ZONE_INFO.name(), + CHANGE_REQUEST_COMPLETE.id(), CHANGE_GET_FIELDS); + String selector = (String) capturedOptions.getValue().get(CHANGE_GET_FIELDS.rpcOption()); + assertEquals(CHANGE_REQUEST_COMPLETE, changeRequest); + assertTrue(selector.contains(Dns.ChangeRequestField.STATUS.selector())); + assertTrue(selector.contains(Dns.ChangeRequestField.ID.selector())); + } + + @Test + public void testApplyChangeRequest() { + EasyMock.expect(dnsRpcMock.applyChangeRequest(ZONE_INFO.name(), CHANGE_REQUEST_PARTIAL.toPb(), + EMPTY_RPC_OPTIONS)).andReturn(CHANGE_REQUEST_COMPLETE.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + ChangeRequest changeRequest = dns.applyChangeRequest(ZONE_INFO.name(), + CHANGE_REQUEST_PARTIAL); + assertEquals(CHANGE_REQUEST_COMPLETE, changeRequest); + } + + @Test + public void testApplyChangeRequestWithOptions() { + Capture> capturedOptions = Capture.newInstance(); + EasyMock.expect(dnsRpcMock.applyChangeRequest(EasyMock.eq(ZONE_INFO.name()), + EasyMock.eq(CHANGE_REQUEST_PARTIAL.toPb()), EasyMock.capture(capturedOptions))) + .andReturn(CHANGE_REQUEST_COMPLETE.toPb()); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + ChangeRequest changeRequest = dns.applyChangeRequest(ZONE_INFO.name(), + CHANGE_REQUEST_PARTIAL, CHANGE_GET_FIELDS); + String selector = (String) capturedOptions.getValue().get(CHANGE_GET_FIELDS.rpcOption()); + assertEquals(CHANGE_REQUEST_COMPLETE, changeRequest); + assertTrue(selector.contains(Dns.ChangeRequestField.STATUS.selector())); + assertTrue(selector.contains(Dns.ChangeRequestField.ID.selector())); + } + + // lists + @Test + public void testListChangeRequests() { + EasyMock.expect(dnsRpcMock.listChangeRequests(ZONE_INFO.name(), EMPTY_RPC_OPTIONS)) + .andReturn(LIST_RESULT_OF_PB_CHANGES); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + Page changeRequestPage = dns.listChangeRequests(ZONE_INFO.name()); + assertTrue(Lists.newArrayList(changeRequestPage.values()).contains(CHANGE_REQUEST_COMPLETE)); + assertTrue(Lists.newArrayList(changeRequestPage.values()).contains(CHANGE_REQUEST_PARTIAL)); + assertEquals(2, Lists.newArrayList(changeRequestPage.values()).size()); + } + + @Test + public void testListChangeRequestsWithOptions() { + Capture> capturedOptions = Capture.newInstance(); + EasyMock.expect(dnsRpcMock.listChangeRequests(EasyMock.eq(ZONE_NAME), + EasyMock.capture(capturedOptions))).andReturn(LIST_RESULT_OF_PB_CHANGES); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + Page changeRequestPage = dns.listChangeRequests(ZONE_NAME, CHANGE_LIST_OPTIONS); + assertTrue(Lists.newArrayList(changeRequestPage.values()).contains(CHANGE_REQUEST_COMPLETE)); + assertTrue(Lists.newArrayList(changeRequestPage.values()).contains(CHANGE_REQUEST_PARTIAL)); + assertEquals(2, Lists.newArrayList(changeRequestPage.values()).size()); + Integer size = (Integer) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[0].rpcOption()); + assertEquals(MAX_SIZE, size); + String selector = (String) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[1].rpcOption()); + assertEquals(PAGE_TOKEN, selector); + selector = (String) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[2].rpcOption()); + assertTrue(selector.contains(Dns.ChangeRequestField.STATUS.selector())); + assertTrue(selector.contains(Dns.ChangeRequestField.ID.selector())); + selector = (String) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[3].rpcOption()); + assertTrue(selector.contains(Dns.SortingOrder.ASCENDING.selector())); + } + + @Test + public void testListZones() { + EasyMock.expect(dnsRpcMock.listZones(EMPTY_RPC_OPTIONS)) + .andReturn(LIST_RESULT_OF_PB_ZONES); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + Page zonePage = dns.listZones(); + assertEquals(1, Lists.newArrayList(zonePage.values()).size()); + assertEquals(ZONE_INFO, Lists.newArrayList(zonePage.values()).get(0)); + } + + @Test + public void testListZonesWithOptions() { + Capture> capturedOptions = Capture.newInstance(); + EasyMock.expect(dnsRpcMock.listZones(EasyMock.capture(capturedOptions))) + .andReturn(LIST_RESULT_OF_PB_ZONES); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + Page zonePage = dns.listZones(ZONE_LIST_OPTIONS); + assertEquals(1, Lists.newArrayList(zonePage.values()).size()); + assertEquals(ZONE_INFO, Lists.newArrayList(zonePage.values()).get(0)); + Integer size = (Integer) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[0].rpcOption()); + assertEquals(MAX_SIZE, size); + String selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[1].rpcOption()); + assertEquals(PAGE_TOKEN, selector); + selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[2].rpcOption()); + assertTrue(selector.contains(Dns.ZoneField.DESCRIPTION.selector())); + assertTrue(selector.contains(Dns.ZoneField.NAME.selector())); + } + + @Test + public void testListDnsRecords() { + EasyMock.expect(dnsRpcMock.listDnsRecords(ZONE_INFO.name(), EMPTY_RPC_OPTIONS)) + .andReturn(LIST_OF_PB_DNS_RECORDS); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + Page dnsPage = dns.listDnsRecords(ZONE_INFO.name()); + assertEquals(2, Lists.newArrayList(dnsPage.values()).size()); + assertTrue(Lists.newArrayList(dnsPage.values()).contains(DNS_RECORD1)); + assertTrue(Lists.newArrayList(dnsPage.values()).contains(DNS_RECORD2)); + } + + @Test + public void testListDnsRecordsWithOptions() { + Capture> capturedOptions = Capture.newInstance(); + EasyMock.expect(dnsRpcMock.listDnsRecords(EasyMock.eq(ZONE_NAME), + EasyMock.capture(capturedOptions))).andReturn(LIST_OF_PB_DNS_RECORDS); + EasyMock.replay(dnsRpcMock); + dns = options.service(); // creates DnsImpl + Page dnsPage = dns.listDnsRecords(ZONE_NAME, DNS_RECORD_LIST_OPTIONS); + assertEquals(2, Lists.newArrayList(dnsPage.values()).size()); + assertTrue(Lists.newArrayList(dnsPage.values()).contains(DNS_RECORD1)); + assertTrue(Lists.newArrayList(dnsPage.values()).contains(DNS_RECORD2)); + Integer size = (Integer) capturedOptions.getValue().get(DNS_RECORD_LIST_OPTIONS[0].rpcOption()); + assertEquals(MAX_SIZE, size); + String selector = (String) capturedOptions.getValue() + .get(DNS_RECORD_LIST_OPTIONS[1].rpcOption()); + assertEquals(PAGE_TOKEN, selector); + selector = (String) capturedOptions.getValue().get(DNS_RECORD_LIST_OPTIONS[2].rpcOption()); + assertTrue(selector.contains(Dns.DnsRecordField.NAME.selector())); + assertTrue(selector.contains(Dns.DnsRecordField.TTL.selector())); + selector = (String) capturedOptions.getValue().get(DNS_RECORD_LIST_OPTIONS[3].rpcOption()); + assertEquals(DNS_RECORD_LIST_OPTIONS[3].value(), selector); + DnsRecord.Type type = (DnsRecord.Type) capturedOptions.getValue().get(DNS_RECORD_LIST_OPTIONS[4] + .rpcOption()); + assertEquals(DNS_RECORD_LIST_OPTIONS[4].value(), type); + } +} From c0c5451d286675248e32fdf3a37c7c9293cd3f4a Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Mon, 8 Feb 2016 11:34:41 -0800 Subject: [PATCH 47/50] Included options attribute to Zone. Fixed symmetry of toPb and fromPb. Finished DnsOptions. Fixed #595. --- .../java/com/google/gcloud/dns/DnsImpl.java | 44 +++++++++---------- .../com/google/gcloud/dns/DnsOptions.java | 4 +- .../main/java/com/google/gcloud/dns/Zone.java | 17 +++++-- .../java/com/google/gcloud/dns/ZoneInfo.java | 19 ++++---- .../com/google/gcloud/dns/DnsImplTest.java | 18 ++++---- .../java/com/google/gcloud/dns/ZoneTest.java | 24 +++++++++- 6 files changed, 79 insertions(+), 47 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java index b3ae73fd7e93..c93409554dd8 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java @@ -120,6 +120,11 @@ public Page nextPage() { } } + @Override + public Page listZones(ZoneListOption... options) { + return listZones(options(), optionMap(options)); + } + private static Page listZones(final DnsOptions serviceOptions, final Map optionsMap) { // define transformation function @@ -151,9 +156,16 @@ public DnsRpc.ListResult call() { } } + @Override + public Page listChangeRequests(String zoneName, + ChangeRequestListOption... options) { + return listChangeRequests(zoneName, options(), optionMap(options), + ChangeRequestPageFetcher.PB_TO_CHANGE_REQUEST); + } + private static Page listChangeRequests(final String zoneName, final DnsOptions serviceOptions, final Map optionsMap, - Function TRANSFORM_FUNCTION) { + Function transformFunction) { try { // get a list of changes DnsRpc.ListResult result = runWithRetries(new Callable>() { @@ -166,7 +178,7 @@ public DnsRpc.ListResult call() { // transform that list into change request objects Iterable changes = result.results() == null ? ImmutableList.of() - : Iterables.transform(result.results(), TRANSFORM_FUNCTION); + : Iterables.transform(result.results(), transformFunction); return new PageImpl<>(new ChangeRequestPageFetcher(zoneName, serviceOptions, cursor, optionsMap), cursor, changes); } catch (RetryHelperException e) { @@ -174,9 +186,15 @@ public DnsRpc.ListResult call() { } } + @Override + public Page listDnsRecords(String zoneName, DnsRecordListOption... options) { + return listDnsRecords(zoneName, options(), optionMap(options), + DnsRecordPageFetcher.PB_TO_DNS_RECORD); + } + private static Page listDnsRecords(final String zoneName, final DnsOptions serviceOptions, final Map optionsMap, - Function TRANSFORM_FUNCTION) { + Function transformFunction) { try { // get a list of resource record sets DnsRpc.ListResult result = runWithRetries( @@ -190,7 +208,7 @@ public DnsRpc.ListResult call() { // transform that list into dns records Iterable records = result.results() == null ? ImmutableList.of() - : Iterables.transform(result.results(), TRANSFORM_FUNCTION); + : Iterables.transform(result.results(), transformFunction); return new PageImpl<>(new DnsRecordPageFetcher(zoneName, serviceOptions, cursor, optionsMap), cursor, records); } catch (RetryHelperException e) { @@ -203,24 +221,6 @@ public DnsRpc.ListResult call() { dnsRpc = options.rpc(); } - @Override - public Page listZones(ZoneListOption... options) { - return listZones(options(), optionMap(options)); - } - - @Override - public Page listChangeRequests(String zoneName, - ChangeRequestListOption... options) { - return listChangeRequests(zoneName, options(), optionMap(options), - ChangeRequestPageFetcher.PB_TO_CHANGE_REQUEST); - } - - @Override - public Page listDnsRecords(String zoneName, DnsRecordListOption... options) { - return listDnsRecords(zoneName, options(), optionMap(options), - DnsRecordPageFetcher.PB_TO_DNS_RECORD); - } - @Override public Zone create(final ZoneInfo zoneInfo, Dns.ZoneOption... options) { final Map optionsMap = optionMap(options); diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java index 1ce4425366e5..b47532146b3a 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java @@ -24,8 +24,7 @@ import java.util.Set; -public class DnsOptions - extends ServiceOptions { +public class DnsOptions extends ServiceOptions { private static final long serialVersionUID = -519128051411747771L; private static final String GC_DNS_RW = "https://www.googleapis.com/auth/ndev.clouddns.readwrite"; @@ -36,7 +35,6 @@ public static class DefaultDnsFactory implements DnsFactory { @Override public Dns create(DnsOptions options) { - // TODO(mderka) Implement when DnsImpl is available. Created issue #595. return new DnsImpl(options); } } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java index 2da67a8e9a01..d53909b0f084 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -20,6 +20,8 @@ import com.google.gcloud.Page; +import java.io.IOException; +import java.io.ObjectInputStream; import java.util.List; import java.util.Objects; @@ -36,7 +38,8 @@ */ public class Zone extends ZoneInfo { - private static final long serialVersionUID = 564454483894599281L; + private static final long serialVersionUID = -5817771337847861598L; + private final DnsOptions options; private transient Dns dns; /** @@ -102,6 +105,7 @@ public Zone build() { Zone(Dns dns, ZoneInfo.BuilderImpl infoBuilder) { super(infoBuilder); this.dns = dns; + this.options = dns.options(); } @Override @@ -115,6 +119,7 @@ public Builder toBuilder() { public Zone(Dns dns, ZoneInfo zoneInfo) { super(new BuilderImpl(zoneInfo)); this.dns = dns; + this.options = dns.options(); } /** @@ -215,12 +220,18 @@ public Dns dns() { @Override public boolean equals(Object obj) { - return obj instanceof Zone && Objects.equals(toPb(), ((Zone) obj).toPb()); + return obj instanceof Zone && Objects.equals(toPb(), ((Zone) obj).toPb()) + && Objects.equals(options, ((Zone) obj).options); } @Override public int hashCode() { - return super.hashCode(); + return Objects.hash(super.hashCode(), options); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + this.dns = options.service(); } static Zone fromPb(Dns dns, com.google.api.services.dns.model.ManagedZone zone) { diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java index e397e37a7fbf..e26dcde70a83 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java @@ -27,7 +27,6 @@ import java.io.Serializable; import java.math.BigInteger; -import java.util.LinkedList; import java.util.List; import java.util.Objects; @@ -97,14 +96,14 @@ public abstract static class Builder { public abstract ZoneInfo build(); } - public static class BuilderImpl extends Builder { + static class BuilderImpl extends Builder { private String name; private String id; private Long creationTimeMillis; private String dnsName; private String description; private String nameServerSet; - private List nameServers = new LinkedList<>(); + private List nameServers; private BuilderImpl(String name) { this.name = checkNotNull(name); @@ -120,7 +119,9 @@ private BuilderImpl(String name) { this.dnsName = info.dnsName; this.description = info.description; this.nameServerSet = info.nameServerSet; - this.nameServers.addAll(info.nameServers); + if (info.nameServers != null) { + this.nameServers = ImmutableList.copyOf(info.nameServers); + } } @Override @@ -179,7 +180,8 @@ public ZoneInfo build() { this.dnsName = builder.dnsName; this.description = builder.description; this.nameServerSet = builder.nameServerSet; - this.nameServers = ImmutableList.copyOf(builder.nameServers); + this.nameServers = builder.nameServers == null + ? null : ImmutableList.copyOf(builder.nameServers); } /** @@ -236,7 +238,7 @@ public String nameServerSet() { * The nameservers that the zone should be delegated to. This is defined by the Google DNS cloud. */ public List nameServers() { - return nameServers; + return nameServers == null ? ImmutableList.of() : nameServers; } /** @@ -255,7 +257,7 @@ com.google.api.services.dns.model.ManagedZone toPb() { pb.setId(new BigInteger(this.id())); } pb.setName(this.name()); - pb.setNameServers(this.nameServers()); + pb.setNameServers(this.nameServers); // do use real attribute value which may be null pb.setNameServerSet(this.nameServerSet()); if (this.creationTimeMillis() != null) { pb.setCreationTime(ISODateTimeFormat.dateTime() @@ -290,7 +292,8 @@ static ZoneInfo fromPb(com.google.api.services.dns.model.ManagedZone pb) { @Override public boolean equals(Object obj) { - return obj instanceof ZoneInfo && Objects.equals(toPb(), ((ZoneInfo) obj).toPb()); + return obj != null && obj.getClass().equals(ZoneInfo.class) + && Objects.equals(toPb(), ((ZoneInfo) obj).toPb()); } @Override diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java index 8e063c9bb096..62e96b05dda5 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java @@ -136,8 +136,8 @@ public void testCreateZone() { .andReturn(ZONE_INFO.toPb()); EasyMock.replay(dnsRpcMock); dns = options.service(); // creates DnsImpl - ZoneInfo zoneInfo = dns.create(ZONE_INFO); - assertEquals(ZONE_INFO, zoneInfo); + Zone zone = dns.create(ZONE_INFO); + assertEquals(new Zone(dns, ZONE_INFO), zone); } @Test @@ -149,7 +149,7 @@ public void testCreateZoneWithOptions() { dns = options.service(); // creates DnsImpl Zone zone = dns.create(ZONE_INFO, ZONE_FIELDS); String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.rpcOption()); - assertEquals(ZONE_INFO, zone); + assertEquals(new Zone(dns, ZONE_INFO), zone); assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.selector())); assertTrue(selector.contains(Dns.ZoneField.NAME.selector())); } @@ -160,8 +160,8 @@ public void testGetZone() { .andReturn(ZONE_INFO.toPb()); EasyMock.replay(dnsRpcMock); dns = options.service(); // creates DnsImpl - ZoneInfo zoneInfo = dns.getZone(ZONE_INFO.name()); - assertEquals(ZONE_INFO, zoneInfo); + Zone zone = dns.getZone(ZONE_INFO.name()); + assertEquals(new Zone(dns, ZONE_INFO), zone); } @Test @@ -171,9 +171,9 @@ public void testGetZoneWithOptions() { EasyMock.capture(capturedOptions))).andReturn(ZONE_INFO.toPb()); EasyMock.replay(dnsRpcMock); dns = options.service(); // creates DnsImpl - ZoneInfo zoneInfo = dns.getZone(ZONE_INFO.name(), ZONE_FIELDS); + Zone zone = dns.getZone(ZONE_INFO.name(), ZONE_FIELDS); String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.rpcOption()); - assertEquals(ZONE_INFO, zoneInfo); + assertEquals(new Zone(dns, ZONE_INFO), zone); assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.selector())); assertTrue(selector.contains(Dns.ZoneField.NAME.selector())); } @@ -308,7 +308,7 @@ public void testListZones() { dns = options.service(); // creates DnsImpl Page zonePage = dns.listZones(); assertEquals(1, Lists.newArrayList(zonePage.values()).size()); - assertEquals(ZONE_INFO, Lists.newArrayList(zonePage.values()).get(0)); + assertEquals(new Zone(dns, ZONE_INFO), Lists.newArrayList(zonePage.values()).get(0)); } @Test @@ -320,7 +320,7 @@ public void testListZonesWithOptions() { dns = options.service(); // creates DnsImpl Page zonePage = dns.listZones(ZONE_LIST_OPTIONS); assertEquals(1, Lists.newArrayList(zonePage.values()).size()); - assertEquals(ZONE_INFO, Lists.newArrayList(zonePage.values()).get(0)); + assertEquals(new Zone(dns, ZONE_INFO), Lists.newArrayList(zonePage.values()).get(0)); Integer size = (Integer) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[0].rpcOption()); assertEquals(MAX_SIZE, size); String selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[1].rpcOption()); diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java index 1b09dca715a4..b28847a4e046 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java @@ -19,6 +19,7 @@ import static org.easymock.EasyMock.createStrictMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.reset; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -64,16 +65,22 @@ public class ZoneTest { .startTimeMillis(123465L).build(); private static final ChangeRequest CHANGE_REQUEST_NO_ID = ChangeRequest.builder().build(); private static final DnsException EXCEPTION = createStrictMock(DnsException.class); + private static final DnsOptions OPTIONS = createStrictMock(DnsOptions.class); private Dns dns; private Zone zone; private Zone zoneNoId; + @Before public void setUp() throws Exception { dns = createStrictMock(Dns.class); + expect(dns.options()).andReturn(OPTIONS); + expect(dns.options()).andReturn(OPTIONS); + replay(dns); zone = new Zone(dns, ZONE_INFO); zoneNoId = new Zone(dns, NO_ID_INFO); + reset(dns); } @After @@ -347,13 +354,13 @@ public void getChangeAndZoneNotFoundByName() { .andThrow(EXCEPTION); replay(dns); try { - ChangeRequest result = zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); + zoneNoId.getChangeRequest(CHANGE_REQUEST.id()); fail("Parent container not found, should throw an exception."); } catch (DnsException e) { // expected } try { - ChangeRequest result = zone.getChangeRequest(CHANGE_REQUEST.id()); + zone.getChangeRequest(CHANGE_REQUEST.id()); fail("Parent container not found, should throw an exception."); } catch (DnsException e) { // expected @@ -505,18 +512,31 @@ public void listChangeRequestsAndZoneNotFound() { @Test public void testFromPb() { + expect(dns.options()).andReturn(OPTIONS); replay(dns); assertEquals(Zone.fromPb(dns, zone.toPb()), zone); } @Test public void testEqualsAndToBuilder() { + expect(dns.options()).andReturn(OPTIONS); + expect(dns.options()).andReturn(OPTIONS); replay(dns); assertEquals(zone, zone.toBuilder().build()); + assertEquals(zone.hashCode(), zone.toBuilder().build().hashCode()); } @Test public void testBuilder() { + // one for each build() call because it invokes a constructor + expect(dns.options()).andReturn(OPTIONS); + expect(dns.options()).andReturn(OPTIONS); + expect(dns.options()).andReturn(OPTIONS); + expect(dns.options()).andReturn(OPTIONS); + expect(dns.options()).andReturn(OPTIONS); + expect(dns.options()).andReturn(OPTIONS); + expect(dns.options()).andReturn(OPTIONS); + expect(dns.options()).andReturn(OPTIONS); replay(dns); assertNotEquals(zone, zone.toBuilder() .id((new BigInteger(zone.id())).add(BigInteger.ONE).toString()) From ee5bb8f1db07dd6a3fb125c16acfd27f8e0c7325 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Mon, 8 Feb 2016 16:35:07 -0800 Subject: [PATCH 48/50] Removed zone.get() and optimized retries. --- .../com/google/gcloud/dns/ChangeRequest.java | 27 +++----- .../main/java/com/google/gcloud/dns/Dns.java | 2 +- .../java/com/google/gcloud/dns/DnsImpl.java | 61 +++++++------------ .../java/com/google/gcloud/dns/DnsRecord.java | 18 +++++- .../main/java/com/google/gcloud/dns/Zone.java | 26 +------- .../java/com/google/gcloud/dns/ZoneInfo.java | 2 +- .../com/google/gcloud/dns/DnsImplTest.java | 42 +++++++------ .../java/com/google/gcloud/dns/ZoneTest.java | 28 +-------- 8 files changed, 77 insertions(+), 129 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java index 582dd2b2e05b..76d231b704c4 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ChangeRequest.java @@ -18,7 +18,7 @@ import static com.google.common.base.Preconditions.checkNotNull; -import com.google.api.services.dns.model.ResourceRecordSet; +import com.google.api.services.dns.model.Change; import com.google.common.base.Function; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; @@ -40,21 +40,14 @@ */ public class ChangeRequest implements Serializable { - private static final Function FROM_PB_FUNCTION = - new Function() { + static final Function FROM_PB_FUNCTION = + new Function() { @Override - public DnsRecord apply(com.google.api.services.dns.model.ResourceRecordSet pb) { - return DnsRecord.fromPb(pb); + public ChangeRequest apply(com.google.api.services.dns.model.Change pb) { + return ChangeRequest.fromPb(pb); } }; - private static final Function TO_PB_FUNCTION = - new Function() { - @Override - public com.google.api.services.dns.model.ResourceRecordSet apply(DnsRecord error) { - return error.toPb(); - } - }; - private static final long serialVersionUID = -8703939628990291682L; + private static final long serialVersionUID = -9027378042756366333L; private final List additions; private final List deletions; private final String id; @@ -274,9 +267,9 @@ com.google.api.services.dns.model.Change toPb() { pb.setStatus(status().name().toLowerCase()); } // set a list of additions - pb.setAdditions(Lists.transform(additions(), TO_PB_FUNCTION)); + pb.setAdditions(Lists.transform(additions(), DnsRecord.TO_PB_FUNCTION)); // set a list of deletions - pb.setDeletions(Lists.transform(deletions(), TO_PB_FUNCTION)); + pb.setDeletions(Lists.transform(deletions(), DnsRecord.TO_PB_FUNCTION)); return pb; } @@ -293,10 +286,10 @@ static ChangeRequest fromPb(com.google.api.services.dns.model.Change pb) { builder.status(ChangeRequest.Status.valueOf(pb.getStatus().toUpperCase())); } if (pb.getDeletions() != null) { - builder.deletions(Lists.transform(pb.getDeletions(), FROM_PB_FUNCTION)); + builder.deletions(Lists.transform(pb.getDeletions(), DnsRecord.FROM_PB_FUNCTION)); } if (pb.getAdditions() != null) { - builder.additions(Lists.transform(pb.getAdditions(), FROM_PB_FUNCTION)); + builder.additions(Lists.transform(pb.getAdditions(), DnsRecord.FROM_PB_FUNCTION)); } return builder.build(); } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index 88e0d7a08591..e724e1cbf1ad 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -419,7 +419,7 @@ public static ChangeRequestListOption sortOrder(SortingOrder order) { /** * Creates a new zone. * - *

Returns {@link ZoneInfo} object representing the new zone's information. In addition to the + *

Returns {@link Zone} object representing the new zone's information. In addition to the * name, dns name and description (supplied by the user within the {@code zoneInfo} parameter), * the returned object can include the following read-only fields supplied by the server: creation * time, id, and list of name servers. The returned fields can be optionally restricted by diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java index c93409554dd8..17521c13c625 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsImpl.java @@ -66,14 +66,7 @@ public Page nextPage() { private static class ChangeRequestPageFetcher implements PageImpl.NextPageFetcher { - private static final Function PB_TO_CHANGE_REQUEST = - new Function() { - @Override - public ChangeRequest apply(com.google.api.services.dns.model.Change changePb) { - return fromPb(changePb); - } - }; - private static final long serialVersionUID = -8737501076674042014L; + private static final long serialVersionUID = 4473265130673029139L; private final String zoneName; private final Map requestOptions; private final DnsOptions serviceOptions; @@ -88,20 +81,13 @@ public ChangeRequest apply(com.google.api.services.dns.model.Change changePb) { @Override public Page nextPage() { - return listChangeRequests(zoneName, serviceOptions, requestOptions, PB_TO_CHANGE_REQUEST); + return listChangeRequests(zoneName, serviceOptions, requestOptions); } } private static class DnsRecordPageFetcher implements PageImpl.NextPageFetcher { - private static final Function PB_TO_DNS_RECORD = - new Function() { - @Override - public DnsRecord apply(com.google.api.services.dns.model.ResourceRecordSet pb) { - return DnsRecord.fromPb(pb); - } - }; - private static final long serialVersionUID = 670996349097667660L; + private static final long serialVersionUID = -6039369212511530846L; private final Map requestOptions; private final DnsOptions serviceOptions; private final String zoneName; @@ -116,10 +102,15 @@ public DnsRecord apply(com.google.api.services.dns.model.ResourceRecordSet pb) { @Override public Page nextPage() { - return listDnsRecords(zoneName, serviceOptions, requestOptions, PB_TO_DNS_RECORD); + return listDnsRecords(zoneName, serviceOptions, requestOptions); } } + DnsImpl(DnsOptions options) { + super(options); + dnsRpc = options.rpc(); + } + @Override public Page listZones(ZoneListOption... options) { return listZones(options(), optionMap(options)); @@ -133,16 +124,17 @@ private static Page listZones(final DnsOptions serviceOptions, @Override public Zone apply( com.google.api.services.dns.model.ManagedZone zonePb) { - return new Zone(serviceOptions.service(), ZoneInfo.fromPb(zonePb)); + return Zone.fromPb(serviceOptions.service(), zonePb); } }; try { // get a list of managed zones + final DnsRpc rpc = serviceOptions.rpc(); DnsRpc.ListResult result = runWithRetries(new Callable>() { @Override public DnsRpc.ListResult call() { - return serviceOptions.rpc().listZones(optionsMap); + return rpc.listZones(optionsMap); } }, serviceOptions.retryParams(), EXCEPTION_HANDLER); String cursor = result.pageToken(); @@ -159,26 +151,25 @@ public DnsRpc.ListResult call() { @Override public Page listChangeRequests(String zoneName, ChangeRequestListOption... options) { - return listChangeRequests(zoneName, options(), optionMap(options), - ChangeRequestPageFetcher.PB_TO_CHANGE_REQUEST); + return listChangeRequests(zoneName, options(), optionMap(options)); } private static Page listChangeRequests(final String zoneName, - final DnsOptions serviceOptions, final Map optionsMap, - Function transformFunction) { + final DnsOptions serviceOptions, final Map optionsMap) { try { // get a list of changes + final DnsRpc rpc = serviceOptions.rpc(); DnsRpc.ListResult result = runWithRetries(new Callable>() { @Override public DnsRpc.ListResult call() { - return serviceOptions.rpc().listChangeRequests(zoneName, optionsMap); + return rpc.listChangeRequests(zoneName, optionsMap); } }, serviceOptions.retryParams(), EXCEPTION_HANDLER); String cursor = result.pageToken(); // transform that list into change request objects Iterable changes = result.results() == null ? ImmutableList.of() - : Iterables.transform(result.results(), transformFunction); + : Iterables.transform(result.results(), ChangeRequest.FROM_PB_FUNCTION); return new PageImpl<>(new ChangeRequestPageFetcher(zoneName, serviceOptions, cursor, optionsMap), cursor, changes); } catch (RetryHelperException e) { @@ -188,27 +179,26 @@ public DnsRpc.ListResult call() { @Override public Page listDnsRecords(String zoneName, DnsRecordListOption... options) { - return listDnsRecords(zoneName, options(), optionMap(options), - DnsRecordPageFetcher.PB_TO_DNS_RECORD); + return listDnsRecords(zoneName, options(), optionMap(options)); } private static Page listDnsRecords(final String zoneName, - final DnsOptions serviceOptions, final Map optionsMap, - Function transformFunction) { + final DnsOptions serviceOptions, final Map optionsMap) { try { // get a list of resource record sets + final DnsRpc rpc = serviceOptions.rpc(); DnsRpc.ListResult result = runWithRetries( new Callable>() { @Override public DnsRpc.ListResult call() { - return serviceOptions.rpc().listDnsRecords(zoneName, optionsMap); + return rpc.listDnsRecords(zoneName, optionsMap); } }, serviceOptions.retryParams(), EXCEPTION_HANDLER); String cursor = result.pageToken(); // transform that list into dns records Iterable records = result.results() == null ? ImmutableList.of() - : Iterables.transform(result.results(), transformFunction); + : Iterables.transform(result.results(), DnsRecord.FROM_PB_FUNCTION); return new PageImpl<>(new DnsRecordPageFetcher(zoneName, serviceOptions, cursor, optionsMap), cursor, records); } catch (RetryHelperException e) { @@ -216,11 +206,6 @@ public DnsRpc.ListResult call() { } } - DnsImpl(DnsOptions options) { - super(options); - dnsRpc = options.rpc(); - } - @Override public Zone create(final ZoneInfo zoneInfo, Dns.ZoneOption... options) { final Map optionsMap = optionMap(options); @@ -318,7 +303,7 @@ public com.google.api.services.dns.model.Change call() { return dnsRpc.getChangeRequest(zoneName, changeRequestId, optionsMap); } }, options().retryParams(), EXCEPTION_HANDLER); - return answer == null ? null : fromPb(answer); // should never be null + return answer == null ? null : fromPb(answer); } catch (RetryHelper.RetryHelperException ex) { throw DnsException.translateAndThrow(ex); } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java index 99ca20386419..c4e710bd0365 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsRecord.java @@ -19,6 +19,8 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import com.google.api.services.dns.model.ResourceRecordSet; +import com.google.common.base.Function; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; @@ -43,7 +45,21 @@ */ public class DnsRecord implements Serializable { - private static final long serialVersionUID = 2016011914302204L; + static final Function FROM_PB_FUNCTION = + new Function() { + @Override + public DnsRecord apply(com.google.api.services.dns.model.ResourceRecordSet pb) { + return DnsRecord.fromPb(pb); + } + }; + static final Function TO_PB_FUNCTION = + new Function() { + @Override + public com.google.api.services.dns.model.ResourceRecordSet apply(DnsRecord error) { + return error.toPb(); + } + }; + private static final long serialVersionUID = 8148009870800115261L; private final String name; private final List rrdatas; private final Integer ttl; // this is in seconds diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java index d53909b0f084..323b0eb8c439 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -113,30 +113,6 @@ public Builder toBuilder() { return new Builder(this); } - /** - * Constructs a {@code Zone} object that contains the given {@code zoneInfo}. - */ - public Zone(Dns dns, ZoneInfo zoneInfo) { - super(new BuilderImpl(zoneInfo)); - this.dns = dns; - this.options = dns.options(); - } - - /** - * Constructs a {@code Zone} object that contains meta information received from the Google Cloud - * DNS service for the provided {@code zoneName}. - * - * @param zoneName name of the zone to be searched for - * @param options optional restriction on what fields should be returned by the service - * @return zone object containing metadata or {@code null} if not not found - * @throws DnsException upon failure - */ - public static Zone get(Dns dnsService, String zoneName, Dns.ZoneOption... options) { - checkNotNull(zoneName); - checkNotNull(dnsService); - return dnsService.getZone(zoneName, options); - } - /** * Retrieves the latest information about the zone. The method retrieves the zone by name. * @@ -236,6 +212,6 @@ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundE static Zone fromPb(Dns dns, com.google.api.services.dns.model.ManagedZone zone) { ZoneInfo info = ZoneInfo.fromPb(zone); - return new Zone(dns, info); + return new Zone(dns, new ZoneInfo.BuilderImpl(info)); } } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java index e26dcde70a83..f02f9f2c5226 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java @@ -81,7 +81,7 @@ public abstract static class Builder { * Optionally specifies the NameServerSet for this zone. A NameServerSet is a set of DNS name * servers that all host the same zones. Most users will not need to specify this value. */ - public abstract Builder nameServerSet(String nameServerSet); + abstract Builder nameServerSet(String nameServerSet); // todo(mderka) add more to the doc when questions are answered by the service owner /** diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java index 62e96b05dda5..726a455418d8 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java @@ -81,20 +81,20 @@ public class DnsImplTest { Dns.ChangeRequestOption.fields(Dns.ChangeRequestField.STATUS); // Listing options - private static final Dns.ZoneListOption[] ZONE_LIST_OPTIONS = - {Dns.ZoneListOption.pageSize(MAX_SIZE), Dns.ZoneListOption.pageToken(PAGE_TOKEN), - Dns.ZoneListOption.fields(Dns.ZoneField.DESCRIPTION)}; - private static final Dns.ChangeRequestListOption[] CHANGE_LIST_OPTIONS = - {Dns.ChangeRequestListOption.pageSize(MAX_SIZE), - Dns.ChangeRequestListOption.pageToken(PAGE_TOKEN), - Dns.ChangeRequestListOption.fields(Dns.ChangeRequestField.STATUS), - Dns.ChangeRequestListOption.sortOrder(Dns.SortingOrder.ASCENDING)}; - private static final Dns.DnsRecordListOption[] DNS_RECORD_LIST_OPTIONS = - {Dns.DnsRecordListOption.pageSize(MAX_SIZE), - Dns.DnsRecordListOption.pageToken(PAGE_TOKEN), - Dns.DnsRecordListOption.fields(Dns.DnsRecordField.TTL), - Dns.DnsRecordListOption.dnsName(DNS_NAME), - Dns.DnsRecordListOption.type(DnsRecord.Type.AAAA)}; + private static final Dns.ZoneListOption[] ZONE_LIST_OPTIONS = { + Dns.ZoneListOption.pageSize(MAX_SIZE), Dns.ZoneListOption.pageToken(PAGE_TOKEN), + Dns.ZoneListOption.fields(Dns.ZoneField.DESCRIPTION)}; + private static final Dns.ChangeRequestListOption[] CHANGE_LIST_OPTIONS = { + Dns.ChangeRequestListOption.pageSize(MAX_SIZE), + Dns.ChangeRequestListOption.pageToken(PAGE_TOKEN), + Dns.ChangeRequestListOption.fields(Dns.ChangeRequestField.STATUS), + Dns.ChangeRequestListOption.sortOrder(Dns.SortingOrder.ASCENDING)}; + private static final Dns.DnsRecordListOption[] DNS_RECORD_LIST_OPTIONS = { + Dns.DnsRecordListOption.pageSize(MAX_SIZE), + Dns.DnsRecordListOption.pageToken(PAGE_TOKEN), + Dns.DnsRecordListOption.fields(Dns.DnsRecordField.TTL), + Dns.DnsRecordListOption.dnsName(DNS_NAME), + Dns.DnsRecordListOption.type(DnsRecord.Type.AAAA)}; // Other private static final Map EMPTY_RPC_OPTIONS = ImmutableMap.of(); @@ -137,7 +137,7 @@ public void testCreateZone() { EasyMock.replay(dnsRpcMock); dns = options.service(); // creates DnsImpl Zone zone = dns.create(ZONE_INFO); - assertEquals(new Zone(dns, ZONE_INFO), zone); + assertEquals(new Zone(dns, new ZoneInfo.BuilderImpl(ZONE_INFO)), zone); } @Test @@ -149,7 +149,7 @@ public void testCreateZoneWithOptions() { dns = options.service(); // creates DnsImpl Zone zone = dns.create(ZONE_INFO, ZONE_FIELDS); String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.rpcOption()); - assertEquals(new Zone(dns, ZONE_INFO), zone); + assertEquals(new Zone(dns, new ZoneInfo.BuilderImpl(ZONE_INFO)), zone); assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.selector())); assertTrue(selector.contains(Dns.ZoneField.NAME.selector())); } @@ -161,7 +161,7 @@ public void testGetZone() { EasyMock.replay(dnsRpcMock); dns = options.service(); // creates DnsImpl Zone zone = dns.getZone(ZONE_INFO.name()); - assertEquals(new Zone(dns, ZONE_INFO), zone); + assertEquals(new Zone(dns, new ZoneInfo.BuilderImpl(ZONE_INFO)), zone); } @Test @@ -173,7 +173,7 @@ public void testGetZoneWithOptions() { dns = options.service(); // creates DnsImpl Zone zone = dns.getZone(ZONE_INFO.name(), ZONE_FIELDS); String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.rpcOption()); - assertEquals(new Zone(dns, ZONE_INFO), zone); + assertEquals(new Zone(dns, new ZoneInfo.BuilderImpl(ZONE_INFO)), zone); assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.selector())); assertTrue(selector.contains(Dns.ZoneField.NAME.selector())); } @@ -308,7 +308,8 @@ public void testListZones() { dns = options.service(); // creates DnsImpl Page zonePage = dns.listZones(); assertEquals(1, Lists.newArrayList(zonePage.values()).size()); - assertEquals(new Zone(dns, ZONE_INFO), Lists.newArrayList(zonePage.values()).get(0)); + assertEquals(new Zone(dns, new ZoneInfo.BuilderImpl(ZONE_INFO)), + Lists.newArrayList(zonePage.values()).get(0)); } @Test @@ -320,7 +321,8 @@ public void testListZonesWithOptions() { dns = options.service(); // creates DnsImpl Page zonePage = dns.listZones(ZONE_LIST_OPTIONS); assertEquals(1, Lists.newArrayList(zonePage.values()).size()); - assertEquals(new Zone(dns, ZONE_INFO), Lists.newArrayList(zonePage.values()).get(0)); + assertEquals(new Zone(dns, new ZoneInfo.BuilderImpl(ZONE_INFO)), + Lists.newArrayList(zonePage.values()).get(0)); Integer size = (Integer) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[0].rpcOption()); assertEquals(MAX_SIZE, size); String selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[1].rpcOption()); diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java index b28847a4e046..5164dfb6001c 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/ZoneTest.java @@ -78,8 +78,8 @@ public void setUp() throws Exception { expect(dns.options()).andReturn(OPTIONS); expect(dns.options()).andReturn(OPTIONS); replay(dns); - zone = new Zone(dns, ZONE_INFO); - zoneNoId = new Zone(dns, NO_ID_INFO); + zone = new Zone(dns, new ZoneInfo.BuilderImpl(ZONE_INFO)); + zoneNoId = new Zone(dns, new ZoneInfo.BuilderImpl(NO_ID_INFO)); reset(dns); } @@ -96,30 +96,6 @@ public void testConstructor() { assertEquals(dns, zone.dns()); } - @Test - public void testGetByName() { - expect(dns.getZone(ZONE_NAME)).andReturn(zone); - expect(dns.getZone(ZONE_NAME, ZONE_FIELD_OPTIONS)).andReturn(zone); // for options - replay(dns); - Zone retrieved = Zone.get(dns, ZONE_NAME); - assertSame(dns, retrieved.dns()); - assertEquals(zone, retrieved); - // test passing options - Zone.get(dns, ZONE_NAME, ZONE_FIELD_OPTIONS); - try { - Zone.get(dns, null); - fail("Cannot get by null name."); - } catch (NullPointerException e) { - // expected - } - try { - Zone.get(null, "Not null"); - fail("Cannot get anything from null service."); - } catch (NullPointerException e) { - // expected - } - } - @Test public void deleteByNameAndFound() { expect(dns.delete(ZONE_NAME)).andReturn(true); From db52e09aaae1101fb80e9e6abcfb55233b1ed57b Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Tue, 9 Feb 2016 08:37:41 -0800 Subject: [PATCH 49/50] Made nameServerSet read only and setters package private. Adds dnsName filter for Zone listing and tests. Adds serialization test. Fixes #630, #602 and #631. --- .../main/java/com/google/gcloud/dns/Dns.java | 8 ++ .../com/google/gcloud/dns/DnsOptions.java | 10 ++ .../main/java/com/google/gcloud/dns/Zone.java | 2 +- .../java/com/google/gcloud/dns/ZoneInfo.java | 8 +- .../com/google/gcloud/dns/DnsImplTest.java | 5 +- .../java/com/google/gcloud/dns/DnsTest.java | 5 + .../google/gcloud/dns/SerializationTest.java | 118 ++++++++++++++++++ 7 files changed, 150 insertions(+), 6 deletions(-) create mode 100644 gcloud-java-dns/src/test/java/com/google/gcloud/dns/SerializationTest.java diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java index e724e1cbf1ad..3ad2094ec2e3 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Dns.java @@ -295,6 +295,14 @@ public static ZoneListOption pageToken(String pageToken) { return new ZoneListOption(DnsRpc.Option.PAGE_TOKEN, pageToken); } + /** + * Restricts the list to only zone with this fully qualified domain name. + */ + public static ZoneListOption dnsName(String dnsName) { + StringBuilder builder = new StringBuilder(); + return new ZoneListOption(DnsRpc.Option.DNS_NAME, dnsName); + } + /** * The maximum number of zones to return per RPC. * diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java index b47532146b3a..d9317546cea0 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsOptions.java @@ -95,4 +95,14 @@ public Builder toBuilder() { public static Builder builder() { return new Builder(); } + + @Override + public boolean equals(Object obj) { + return obj instanceof DnsOptions && baseEquals((DnsOptions) obj); + } + + @Override + public int hashCode() { + return baseHashCode(); + } } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java index 323b0eb8c439..41507647543a 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/Zone.java @@ -85,7 +85,7 @@ public Builder description(String description) { } @Override - public Builder nameServerSet(String nameServerSet) { + Builder nameServerSet(String nameServerSet) { infoBuilder.nameServerSet(nameServerSet); return this; } diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java index f02f9f2c5226..7dffbcdd365c 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/ZoneInfo.java @@ -82,7 +82,7 @@ public abstract static class Builder { * servers that all host the same zones. Most users will not need to specify this value. */ abstract Builder nameServerSet(String nameServerSet); - // todo(mderka) add more to the doc when questions are answered by the service owner + // this should not be included in tooling as per the service owners /** * Sets a list of servers that hold the information about the zone. This information is provided @@ -155,7 +155,7 @@ public Builder description(String description) { } @Override - public Builder nameServerSet(String nameServerSet) { + Builder nameServerSet(String nameServerSet) { this.nameServerSet = checkNotNull(nameServerSet); return this; } @@ -227,10 +227,10 @@ public String description() { } /** - * Returns the optionally specified set of DNS name servers that all host this zone. + * Returns the optionally specified set of DNS name servers that all host this zone. This value is + * set only for specific use cases and is left empty for vast majority of users. */ public String nameServerSet() { - // todo(mderka) update this doc after finding out more about this from the service owners return nameServerSet; } diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java index 726a455418d8..89ad90f27654 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsImplTest.java @@ -83,7 +83,8 @@ public class DnsImplTest { // Listing options private static final Dns.ZoneListOption[] ZONE_LIST_OPTIONS = { Dns.ZoneListOption.pageSize(MAX_SIZE), Dns.ZoneListOption.pageToken(PAGE_TOKEN), - Dns.ZoneListOption.fields(Dns.ZoneField.DESCRIPTION)}; + Dns.ZoneListOption.fields(Dns.ZoneField.DESCRIPTION), + Dns.ZoneListOption.dnsName(DNS_NAME)}; private static final Dns.ChangeRequestListOption[] CHANGE_LIST_OPTIONS = { Dns.ChangeRequestListOption.pageSize(MAX_SIZE), Dns.ChangeRequestListOption.pageToken(PAGE_TOKEN), @@ -330,6 +331,8 @@ public void testListZonesWithOptions() { selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[2].rpcOption()); assertTrue(selector.contains(Dns.ZoneField.DESCRIPTION.selector())); assertTrue(selector.contains(Dns.ZoneField.NAME.selector())); + selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[3].rpcOption()); + assertEquals(DNS_NAME, selector); } @Test diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java index 74faca329884..92a18ad9c1e7 100644 --- a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/DnsTest.java @@ -27,6 +27,7 @@ public class DnsTest { private static final Integer PAGE_SIZE = 20; private static final String PAGE_TOKEN = "page token"; + private static final String DNS_NAME = "www.example.com."; @Test public void testDnsRecordListOption() { @@ -89,6 +90,10 @@ public void testZoneList() { option = Dns.ZoneListOption.pageSize(PAGE_SIZE); assertEquals(PAGE_SIZE, option.value()); assertEquals(DnsRpc.Option.PAGE_SIZE, option.rpcOption()); + // dnsName filter + option = Dns.ZoneListOption.dnsName(DNS_NAME); + assertEquals(DNS_NAME, option.value()); + assertEquals(DnsRpc.Option.DNS_NAME, option.rpcOption()); } @Test diff --git a/gcloud-java-dns/src/test/java/com/google/gcloud/dns/SerializationTest.java b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/SerializationTest.java new file mode 100644 index 000000000000..adf5744d854e --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/gcloud/dns/SerializationTest.java @@ -0,0 +1,118 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed 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 com.google.gcloud.dns; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; + +import com.google.common.collect.ImmutableList; +import com.google.gcloud.RetryParams; + +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.math.BigInteger; +import java.util.concurrent.TimeUnit; + +public class SerializationTest { + + private static final ZoneInfo FULL_ZONE_INFO = Zone.builder("some zone name") + .creationTimeMillis(132L) + .description("some descriptions") + .dnsName("www.example.com") + .id("123333") + .nameServers(ImmutableList.of("server 1", "server 2")) + .nameServerSet("specificationstring") + .build(); + private static final ZoneInfo PARTIAL_ZONE_INFO = Zone.builder("some zone name") + .build(); + private static final ProjectInfo PARTIAL_PROJECT_INFO = ProjectInfo.builder().id("13").build(); + private static final ProjectInfo FULL_PROJECT_INFO = ProjectInfo.builder() + .id("342") + .number(new BigInteger("2343245")) + .quota(new ProjectInfo.Quota(12, 13, 14, 15, 16, 17)) + .build(); + private static final Dns.ZoneListOption ZONE_LIST_OPTION = + Dns.ZoneListOption.dnsName("www.example.com."); + private static final Dns.DnsRecordListOption DNS_REOCRD_LIST_OPTION = + Dns.DnsRecordListOption.fields(Dns.DnsRecordField.TTL); + private static final Dns.ChangeRequestListOption CHANGE_REQUEST_LIST_OPTION = + Dns.ChangeRequestListOption.fields(Dns.ChangeRequestField.STATUS); + private static final Dns.ZoneOption ZONE_OPTION = + Dns.ZoneOption.fields(Dns.ZoneField.CREATION_TIME); + private static final Dns.ChangeRequestOption CHANGE_REQUEST_OPTION = + Dns.ChangeRequestOption.fields(Dns.ChangeRequestField.STATUS); + private static final Dns.ProjectOption PROJECT_OPTION = + Dns.ProjectOption.fields(Dns.ProjectField.QUOTA); + private static final DnsOptions OPTIONS = DnsOptions.builder() + .projectId("some-unnecessary-project-ID") + .retryParams(RetryParams.defaultInstance()) + .build(); + private static final Dns DNS = OPTIONS.service(); + private static final Zone FULL_ZONE = new Zone(DNS, new ZoneInfo.BuilderImpl(FULL_ZONE_INFO)); + private static final Zone PARTIAL_ZONE = + new Zone(DNS, new ZoneInfo.BuilderImpl(PARTIAL_ZONE_INFO)); + private static final ChangeRequest CHANGE_REQUEST_PARTIAL = ChangeRequest.builder().build(); + private static final DnsRecord DNS_RECORD_PARTIAL = + DnsRecord.builder("www.www.com", DnsRecord.Type.AAAA).build(); + private static final DnsRecord DNS_RECORD_COMPLETE = + DnsRecord.builder("www.sadfa.com", DnsRecord.Type.A) + .ttl(12, TimeUnit.HOURS) + .addRecord("record") + .build(); + private static final ChangeRequest CHANGE_REQUEST_COMPLETE = ChangeRequest.builder() + .add(DNS_RECORD_COMPLETE) + .delete(DNS_RECORD_PARTIAL) + .status(ChangeRequest.Status.PENDING) + .id("some id") + .startTimeMillis(132L) + .build(); + + + @Test + public void testModelAndRequests() throws Exception { + Serializable[] objects = {FULL_ZONE_INFO, PARTIAL_ZONE_INFO, ZONE_LIST_OPTION, + DNS_REOCRD_LIST_OPTION, CHANGE_REQUEST_LIST_OPTION, ZONE_OPTION, CHANGE_REQUEST_OPTION, + PROJECT_OPTION, PARTIAL_PROJECT_INFO, FULL_PROJECT_INFO, OPTIONS, FULL_ZONE, PARTIAL_ZONE, + OPTIONS, CHANGE_REQUEST_PARTIAL, DNS_RECORD_PARTIAL, DNS_RECORD_COMPLETE, + CHANGE_REQUEST_COMPLETE}; + for (Serializable obj : objects) { + Object copy = serializeAndDeserialize(obj); + assertEquals(obj, obj); + assertEquals(obj, copy); + assertNotSame(obj, copy); + assertEquals(copy, copy); + } + } + + @SuppressWarnings("unchecked") + private T serializeAndDeserialize(T obj) throws IOException, ClassNotFoundException { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + try (ObjectOutputStream output = new ObjectOutputStream(bytes)) { + output.writeObject(obj); + } + try (ObjectInputStream input = + new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) { + return (T) input.readObject(); + } + } +} From c3e3549bcfe454b662df4b3ab6df56ff33cca103 Mon Sep 17 00:00:00 2001 From: Martin Derka Date: Tue, 1 Mar 2016 11:57:36 -0800 Subject: [PATCH 50/50] Added retryable errors. --- .../java/com/google/gcloud/dns/DnsException.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java index 2092d5909d37..25fafcb69df9 100644 --- a/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java +++ b/gcloud-java-dns/src/main/java/com/google/gcloud/dns/DnsException.java @@ -16,17 +16,26 @@ package com.google.gcloud.dns; +import com.google.common.collect.ImmutableSet; import com.google.gcloud.BaseServiceException; import com.google.gcloud.RetryHelper.RetryHelperException; import com.google.gcloud.RetryHelper.RetryInterruptedException; import java.io.IOException; +import java.util.Set; /** * DNS service exception. */ public class DnsException extends BaseServiceException { + // see: https://cloud.google.com/dns/troubleshooting + private static final Set RETRYABLE_ERRORS = ImmutableSet.of( + new Error(404, null), + new Error(409, null), + new Error(500, null), + new Error(502, null), + new Error(503, null)); private static final long serialVersionUID = 490302380416260252L; public DnsException(IOException exception) { @@ -37,6 +46,11 @@ public DnsException(int code, String message) { super(code, message, null, true); } + @Override + protected Set retryableErrors() { + return RETRYABLE_ERRORS; + } + /** * Translate RetryHelperException to the DnsException that caused the error. This method will * always throw an exception. @@ -48,6 +62,4 @@ static DnsException translateAndThrow(RetryHelperException ex) { BaseServiceException.translateAndPropagateIfPossible(ex); throw new DnsException(UNKNOWN_CODE, ex.getMessage()); } - - //TODO(mderka) Add translation and retry functionality. Created issue #593. }