diff --git a/java/google/registry/model/registry/Registry.java b/java/google/registry/model/registry/Registry.java
index f572c65ec..f93ba9cc2 100644
--- a/java/google/registry/model/registry/Registry.java
+++ b/java/google/registry/model/registry/Registry.java
@@ -21,6 +21,7 @@ import static com.google.common.base.Predicates.not;
import static google.registry.config.RegistryConfig.getSingletonCacheRefreshDuration;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.model.ofy.ObjectifyService.ofy;
+import static google.registry.util.CollectionUtils.isNullOrEmpty;
import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy;
import static google.registry.util.DateTimeUtils.END_OF_TIME;
import static google.registry.util.DateTimeUtils.START_OF_TIME;
@@ -49,6 +50,7 @@ import com.googlecode.objectify.annotation.Embed;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Mapify;
+import com.googlecode.objectify.annotation.OnLoad;
import com.googlecode.objectify.annotation.OnSave;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.Buildable;
@@ -269,9 +271,30 @@ public class Registry extends ImmutableObject implements Buildable {
*
*
This must be a valid key for the map of DnsWriters injected by
* @Inject Map
+ *
+ * @deprecated by dnsWriters
*/
+ // TODO(b/63385623): Delete this field when the data migration is complete.
+ @Deprecated
String dnsWriter;
+ /**
+ * The set of name(s) of the {@code DnsWriter} implementations that this TLD uses.
+ *
+ *
There must be at least one entry in this set.
+ *
+ *
All entries of this list must be valid keys for the map of {@code DnsWriter}s injected by
+ * @Inject Map
+ */
+ Set dnsWriters;
+
+ @OnLoad
+ public void migrateDnsWriters() {
+ if (isNullOrEmpty(dnsWriters)) {
+ dnsWriters = ImmutableSet.of(dnsWriter);
+ }
+ }
+
/**
* The unicode-aware representation of the TLD associated with this {@link Registry}.
*
@@ -588,10 +611,15 @@ public class Registry extends ImmutableObject implements Buildable {
return pricingEngineClassName;
}
+ @Deprecated
public String getDnsWriter() {
return dnsWriter;
}
+ public ImmutableSet getDnsWriters() {
+ return ImmutableSet.copyOf(dnsWriters);
+ }
+
public ImmutableSet getAllowedRegistrantContactIds() {
return nullToEmptyImmutableCopy(allowedRegistrantContactIds);
}
@@ -676,6 +704,7 @@ public class Registry extends ImmutableObject implements Buildable {
public Builder setDnsWriter(String dnsWriter) {
getInstance().dnsWriter = checkArgumentNotNull(dnsWriter);
+ getInstance().dnsWriters = ImmutableSet.of(dnsWriter);
return this;
}
@@ -946,6 +975,10 @@ public class Registry extends ImmutableObject implements Buildable {
checkArgumentNotNull(
instance.dnsWriter,
"A DNS writer must be specified. VoidDnsWriter can be used if DNS writing isn't wanted");
+ checkArgument(
+ instance.dnsWriters != null && !instance.dnsWriters.isEmpty(),
+ "At least one DNS writer must be specified."
+ + " VoidDnsWriter can be used if DNS writing isn't desired");
instance.tldStrId = tldName;
instance.tldUnicode = Idn.toUnicode(tldName);
return super.build();
diff --git a/javatests/google/registry/model/schema.txt b/javatests/google/registry/model/schema.txt
index 4ec26a6e9..2b8eb8109 100644
--- a/javatests/google/registry/model/schema.txt
+++ b/javatests/google/registry/model/schema.txt
@@ -700,6 +700,7 @@ class google.registry.model.registry.Registry {
java.util.Set> reservedLists;
java.util.Set allowedFullyQualifiedHostNames;
java.util.Set allowedRegistrantContactIds;
+ java.util.Set dnsWriters;
org.joda.money.CurrencyUnit currency;
org.joda.money.Money createBillingCost;
org.joda.money.Money restoreBillingCost;
diff --git a/javatests/google/registry/tools/SetupOteCommandTest.java b/javatests/google/registry/tools/SetupOteCommandTest.java
index 36584727d..c1d80c282 100644
--- a/javatests/google/registry/tools/SetupOteCommandTest.java
+++ b/javatests/google/registry/tools/SetupOteCommandTest.java
@@ -68,6 +68,7 @@ public class SetupOteCommandTest extends CommandTestCase {
assertThat(registry.getRoidSuffix()).isEqualTo(roidSuffix);
assertThat(registry.getTldState(DateTime.now(UTC))).isEqualTo(tldState);
assertThat(registry.getDnsWriter()).isEqualTo(dnsWriter);
+ assertThat(registry.getDnsWriters()).containsExactly(dnsWriter);
assertThat(registry.getPremiumList()).isNotNull();
assertThat(registry.getPremiumList().getName()).isEqualTo(premiumList);
assertThat(registry.getAddGracePeriodLength()).isEqualTo(addGracePeriodLength);
diff --git a/javatests/google/registry/tools/UpdateTldCommandTest.java b/javatests/google/registry/tools/UpdateTldCommandTest.java
index 59911798f..fd02ff6f3 100644
--- a/javatests/google/registry/tools/UpdateTldCommandTest.java
+++ b/javatests/google/registry/tools/UpdateTldCommandTest.java
@@ -177,8 +177,11 @@ public class UpdateTldCommandTest extends CommandTestCase {
@Test
public void testSuccess_dnsWriter() throws Exception {
assertThat(Registry.get("xn--q9jyb4c").getDnsWriter()).isEqualTo("VoidDnsWriter");
+ assertThat(Registry.get("xn--q9jyb4c").getDnsWriters()).containsExactly("VoidDnsWriter");
+
runCommandForced("--dns_writer=FooDnsWriter", "xn--q9jyb4c");
assertThat(Registry.get("xn--q9jyb4c").getDnsWriter()).isEqualTo("FooDnsWriter");
+ assertThat(Registry.get("xn--q9jyb4c").getDnsWriters()).containsExactly("FooDnsWriter");
}
@Test