Remove ofy support from registrar (#1762)

Also fixes some warnings about the use of raw types.
This commit is contained in:
Lai Jiang 2022-09-07 14:24:42 -04:00 committed by GitHub
parent 6d0c081a5d
commit bc091f25ca
10 changed files with 48 additions and 131 deletions

View file

@ -27,7 +27,6 @@ import google.registry.model.host.HostHistory;
import google.registry.model.index.EppResourceIndex; import google.registry.model.index.EppResourceIndex;
import google.registry.model.index.EppResourceIndexBucket; import google.registry.model.index.EppResourceIndexBucket;
import google.registry.model.index.ForeignKeyIndex; import google.registry.model.index.ForeignKeyIndex;
import google.registry.model.registrar.Registrar;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.model.server.Lock; import google.registry.model.server.Lock;
import google.registry.model.server.ServerSecret; import google.registry.model.server.ServerSecret;
@ -54,7 +53,6 @@ public final class EntityClasses {
Host.class, Host.class,
HostHistory.class, HostHistory.class,
Lock.class, Lock.class,
Registrar.class,
ServerSecret.class); ServerSecret.class);
private EntityClasses() {} private EntityClasses() {}

View file

@ -257,7 +257,7 @@ public abstract class ImmutableObject implements Cloneable {
return (Map<String, Object>) toMapRecursive(this); return (Map<String, Object>) toMapRecursive(this);
} }
public VKey createVKey() { public VKey<? extends ImmutableObject> createVKey() {
throw new UnsupportedOperationException("VKey creation is not supported for this entity"); throw new UnsupportedOperationException("VKey creation is not supported for this entity");
} }
} }

View file

@ -212,6 +212,9 @@ public abstract class BillingEvent extends ImmutableObject
return nullToEmptyImmutableCopy(flags); return nullToEmptyImmutableCopy(flags);
} }
@Override
public abstract VKey<? extends BillingEvent> createVKey();
/** Override Buildable.asBuilder() to give this method stronger typing. */ /** Override Buildable.asBuilder() to give this method stronger typing. */
@Override @Override
public abstract Builder<?, ?> asBuilder(); public abstract Builder<?, ?> asBuilder();

View file

@ -215,6 +215,9 @@ public abstract class PollMessage extends ImmutableObject
return domainRepoId != null ? Type.DOMAIN : contactRepoId != null ? Type.CONTACT : Type.HOST; return domainRepoId != null ? Type.DOMAIN : contactRepoId != null ? Type.CONTACT : Type.HOST;
} }
@Override
public abstract VKey<? extends PollMessage> createVKey();
public abstract ImmutableList<ResponseData> getResponseData(); public abstract ImmutableList<ResponseData> getResponseData();
/** Override Buildable.asBuilder() to give this method stronger typing. */ /** Override Buildable.asBuilder() to give this method stronger typing. */

View file

@ -26,8 +26,6 @@ import static com.google.common.collect.Sets.immutableEnumSet;
import static com.google.common.io.BaseEncoding.base64; import static com.google.common.io.BaseEncoding.base64;
import static google.registry.config.RegistryConfig.getDefaultRegistrarWhoisServer; import static google.registry.config.RegistryConfig.getDefaultRegistrarWhoisServer;
import static google.registry.model.CacheUtils.memoizeWithShortExpiration; import static google.registry.model.CacheUtils.memoizeWithShortExpiration;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.model.tld.Registries.assertTldsExist; import static google.registry.model.tld.Registries.assertTldsExist;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm; import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
@ -44,7 +42,6 @@ import static java.util.function.Predicate.isEqual;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
@ -55,12 +52,6 @@ import com.google.common.collect.Range;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.common.collect.Streams; import com.google.common.collect.Streams;
import com.google.re2j.Pattern; import com.google.re2j.Pattern;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Ignore;
import com.googlecode.objectify.annotation.Index;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.Buildable; import google.registry.model.Buildable;
import google.registry.model.CreateAutoTimestamp; import google.registry.model.CreateAutoTimestamp;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
@ -68,9 +59,6 @@ import google.registry.model.JsonMapBuilder;
import google.registry.model.Jsonifiable; import google.registry.model.Jsonifiable;
import google.registry.model.UnsafeSerializable; import google.registry.model.UnsafeSerializable;
import google.registry.model.UpdateAutoTimestamp; import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.annotations.InCrossTld;
import google.registry.model.annotations.ReportedOn;
import google.registry.model.common.EntityGroupRoot;
import google.registry.model.tld.Registry; import google.registry.model.tld.Registry;
import google.registry.model.tld.Registry.TldType; import google.registry.model.tld.Registry.TldType;
import google.registry.persistence.VKey; import google.registry.persistence.VKey;
@ -83,6 +71,7 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.mail.internet.AddressException; import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
@ -90,25 +79,22 @@ import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides; import javax.persistence.AttributeOverrides;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Embedded; import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType; import javax.persistence.EnumType;
import javax.persistence.Enumerated; import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.Transient;
import org.joda.money.CurrencyUnit; import org.joda.money.CurrencyUnit;
import org.joda.time.DateTime; import org.joda.time.DateTime;
/** Information about a registrar. */ /** Information about a registrar. */
@ReportedOn
@Entity @Entity
@javax.persistence.Entity
@Table( @Table(
indexes = { indexes = {
@javax.persistence.Index(columnList = "registrarName", name = "registrar_name_idx"), @Index(columnList = "registrarName", name = "registrar_name_idx"),
@javax.persistence.Index( @Index(columnList = "ianaIdentifier", name = "registrar_iana_identifier_idx"),
columnList = "ianaIdentifier",
name = "registrar_iana_identifier_idx"),
}) })
@InCrossTld
public class Registrar extends ImmutableObject public class Registrar extends ImmutableObject
implements Buildable, Jsonifiable, UnsafeSerializable { implements Buildable, Jsonifiable, UnsafeSerializable {
@ -197,7 +183,7 @@ public class Registrar extends ImmutableObject
/** The states in which a {@link Registrar} is considered {@link #isLive live}. */ /** The states in which a {@link Registrar} is considered {@link #isLive live}. */
private static final ImmutableSet<State> LIVE_STATES = private static final ImmutableSet<State> LIVE_STATES =
Sets.immutableEnumSet(State.ACTIVE, State.SUSPENDED); immutableEnumSet(State.ACTIVE, State.SUSPENDED);
/** /**
* The types for which a {@link Registrar} should be included in WHOIS and RDAP output. We exclude * The types for which a {@link Registrar} should be included in WHOIS and RDAP output. We exclude
@ -213,18 +199,9 @@ public class Registrar extends ImmutableObject
private static final Comparator<RegistrarPoc> CONTACT_EMAIL_COMPARATOR = private static final Comparator<RegistrarPoc> CONTACT_EMAIL_COMPARATOR =
comparing(RegistrarPoc::getEmailAddress, String::compareTo); comparing(RegistrarPoc::getEmailAddress, String::compareTo);
/** /** A caching {@link Supplier} of a registrarId to {@link Registrar} map. */
* A caching {@link Supplier} of a registrarId to {@link Registrar} map.
*
* <p>The supplier's get() method enters a transactionless context briefly to avoid enrolling the
* query inside an unrelated client-affecting transaction.
*/
private static final Supplier<ImmutableMap<String, Registrar>> CACHE_BY_REGISTRAR_ID = private static final Supplier<ImmutableMap<String, Registrar>> CACHE_BY_REGISTRAR_ID =
memoizeWithShortExpiration( memoizeWithShortExpiration(() -> Maps.uniqueIndex(loadAll(), Registrar::getRegistrarId));
() ->
tm().doTransactionless(() -> Maps.uniqueIndex(loadAll(), Registrar::getRegistrarId)));
@Parent @Transient Key<EntityGroupRoot> parent = getCrossTldKey();
/** /**
* Unique registrar client id. Must conform to "clIDType" as defined in RFC5730. * Unique registrar client id. Must conform to "clIDType" as defined in RFC5730.
@ -233,7 +210,6 @@ public class Registrar extends ImmutableObject
* <p>TODO(b/177567432): Rename this field to registrarId. * <p>TODO(b/177567432): Rename this field to registrarId.
*/ */
@Id @Id
@javax.persistence.Id
@Column(name = "registrarId", nullable = false) @Column(name = "registrarId", nullable = false)
String clientIdentifier; String clientIdentifier;
@ -248,7 +224,6 @@ public class Registrar extends ImmutableObject
* @see <a href="http://www.icann.org/registrar-reports/accredited-list.html">ICANN-Accredited * @see <a href="http://www.icann.org/registrar-reports/accredited-list.html">ICANN-Accredited
* Registrars</a> * Registrars</a>
*/ */
@Index
@Column(nullable = false) @Column(nullable = false)
String registrarName; String registrarName;
@ -313,7 +288,6 @@ public class Registrar extends ImmutableObject
* Localized {@link RegistrarAddress} for this registrar. Contents can be represented in * Localized {@link RegistrarAddress} for this registrar. Contents can be represented in
* unrestricted UTF-8. * unrestricted UTF-8.
*/ */
@Ignore
@Embedded @Embedded
@AttributeOverrides({ @AttributeOverrides({
@AttributeOverride( @AttributeOverride(
@ -338,7 +312,6 @@ public class Registrar extends ImmutableObject
* Internationalized {@link RegistrarAddress} for this registrar. All contained values must be * Internationalized {@link RegistrarAddress} for this registrar. All contained values must be
* representable in the 7-bit US-ASCII character set. * representable in the 7-bit US-ASCII character set.
*/ */
@Ignore
@Embedded @Embedded
@AttributeOverrides({ @AttributeOverrides({
@AttributeOverride(name = "streetLine1", column = @Column(name = "i18n_address_street_line1")), @AttributeOverride(name = "streetLine1", column = @Column(name = "i18n_address_street_line1")),
@ -367,14 +340,14 @@ public class Registrar extends ImmutableObject
* *
* <ul> * <ul>
* <li>8 is used for Testing Registrar. * <li>8 is used for Testing Registrar.
* <li>9997 is used by ICAAN for SLA monitoring. * <li>9997 is used by ICANN for SLA monitoring.
* <li>9999 is used for cases when the registry operator acts as registrar. * <li>9999 is used for cases when the registry operator acts as registrar.
* </ul> * </ul>
* *
* @see <a href="http://www.iana.org/assignments/registrar-ids/registrar-ids.txt">Registrar * @see <a href="http://www.iana.org/assignments/registrar-ids/registrar-ids.txt">Registrar
* IDs</a> * IDs</a>
*/ */
@Index @Nullable Long ianaIdentifier; @Nullable Long ianaIdentifier;
/** Purchase Order number used for invoices in external billing system, if applicable. */ /** Purchase Order number used for invoices in external billing system, if applicable. */
@Nullable String poNumber; @Nullable String poNumber;
@ -395,7 +368,7 @@ public class Registrar extends ImmutableObject
/** /**
* ICANN referral email address. * ICANN referral email address.
* *
* <p>This value is specified in the initial registrar contact. It can't be edited in the web GUI * <p>This value is specified in the initial registrar contact. It can't be edited in the web GUI,
* and it must be specified when the registrar account is created. * and it must be specified when the registrar account is created.
*/ */
String icannReferralEmail; String icannReferralEmail;
@ -406,10 +379,10 @@ public class Registrar extends ImmutableObject
// Metadata. // Metadata.
/** The time when this registrar was created. */ /** The time when this registrar was created. */
@Ignore CreateAutoTimestamp creationTime = CreateAutoTimestamp.create(null); CreateAutoTimestamp creationTime = CreateAutoTimestamp.create(null);
/** An automatically managed last-saved timestamp. */ /** An automatically managed last-saved timestamp. */
@Ignore UpdateAutoTimestamp lastUpdateTime = UpdateAutoTimestamp.create(null); UpdateAutoTimestamp lastUpdateTime = UpdateAutoTimestamp.create(null);
/** The time that the certificate was last updated. */ /** The time that the certificate was last updated. */
DateTime lastCertificateUpdateTime; DateTime lastCertificateUpdateTime;
@ -610,18 +583,13 @@ public class Registrar extends ImmutableObject
} }
private Iterable<RegistrarPoc> getContactsIterable() { private Iterable<RegistrarPoc> getContactsIterable() {
if (tm().isOfy()) { return tm().transact(
return auditedOfy().load().type(RegistrarPoc.class).ancestor(Registrar.this); () ->
} else { jpaTm()
return tm().transact( .query("FROM RegistrarPoc WHERE registrarId = :registrarId", RegistrarPoc.class)
() -> .setParameter("registrarId", clientIdentifier)
jpaTm() .getResultStream()
.query( .collect(toImmutableList()));
"FROM RegistrarPoc WHERE registrarId = :registrarId", RegistrarPoc.class)
.setParameter("registrarId", clientIdentifier)
.getResultStream()
.collect(toImmutableList()));
}
} }
@Override @Override
@ -687,18 +655,13 @@ public class Registrar extends ImmutableObject
/** Creates a {@link VKey} for this instance. */ /** Creates a {@link VKey} for this instance. */
@Override @Override
public VKey<Registrar> createVKey() { public VKey<Registrar> createVKey() {
return createVKey(Key.create(this)); return createVKey(clientIdentifier);
} }
/** Creates a {@link VKey} for the given {@code registrarId}. */ /** Creates a {@link VKey} for the given {@code registrarId}. */
public static VKey<Registrar> createVKey(String registrarId) { public static VKey<Registrar> createVKey(String registrarId) {
checkArgumentNotNull(registrarId, "registrarId must be specified"); checkArgumentNotNull(registrarId, "registrarId must be specified");
return createVKey(Key.create(getCrossTldKey(), Registrar.class, registrarId)); return VKey.createSql(Registrar.class, registrarId);
}
/** Creates a {@link VKey} instance from a {@link Key} instance. */
public static VKey<Registrar> createVKey(Key<Registrar> key) {
return VKey.create(Registrar.class, key.getName(), key);
} }
/** A builder for constructing {@link Registrar}, since it is immutable. */ /** A builder for constructing {@link Registrar}, since it is immutable. */
@ -774,7 +737,7 @@ public class Registrar extends ImmutableObject
Set<VKey<Registry>> missingTldKeys = Set<VKey<Registry>> missingTldKeys =
Sets.difference( Sets.difference(
newTldKeys, tm().transact(() -> tm().loadByKeysIfPresent(newTldKeys)).keySet()); newTldKeys, tm().transact(() -> tm().loadByKeysIfPresent(newTldKeys)).keySet());
checkArgument(missingTldKeys.isEmpty(), "Trying to set nonexisting TLDs: %s", missingTldKeys); checkArgument(missingTldKeys.isEmpty(), "Trying to set nonexistent TLDs: %s", missingTldKeys);
getInstance().allowedTlds = ImmutableSortedSet.copyOf(allowedTlds); getInstance().allowedTlds = ImmutableSortedSet.copyOf(allowedTlds);
return this; return this;
} }

View file

@ -38,8 +38,8 @@ import javax.persistence.MappedSuperclass;
*/ */
@MappedSuperclass @MappedSuperclass
@Access(AccessType.FIELD) @Access(AccessType.FIELD)
public abstract class EppHistoryVKey<K, E extends EppResource> extends ImmutableObject public abstract class EppHistoryVKey<K extends ImmutableObject, E extends EppResource>
implements Serializable { extends ImmutableObject implements Serializable {
private static final long serialVersionUID = -3906580677709539818L; private static final long serialVersionUID = -3906580677709539818L;

View file

@ -26,7 +26,6 @@ import google.registry.model.index.EppResourceIndexBucket;
import google.registry.model.index.ForeignKeyIndex.ForeignKeyContactIndex; import google.registry.model.index.ForeignKeyIndex.ForeignKeyContactIndex;
import google.registry.model.index.ForeignKeyIndex.ForeignKeyDomainIndex; import google.registry.model.index.ForeignKeyIndex.ForeignKeyDomainIndex;
import google.registry.model.index.ForeignKeyIndex.ForeignKeyHostIndex; import google.registry.model.index.ForeignKeyIndex.ForeignKeyHostIndex;
import google.registry.model.registrar.Registrar;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.model.server.Lock; import google.registry.model.server.Lock;
import google.registry.model.server.ServerSecret; import google.registry.model.server.ServerSecret;
@ -49,7 +48,6 @@ public class ClassPathManagerTest {
assertThat(ClassPathManager.getClass("ForeignKeyContactIndex")) assertThat(ClassPathManager.getClass("ForeignKeyContactIndex"))
.isEqualTo(ForeignKeyContactIndex.class); .isEqualTo(ForeignKeyContactIndex.class);
assertThat(ClassPathManager.getClass("Host")).isEqualTo(Host.class); assertThat(ClassPathManager.getClass("Host")).isEqualTo(Host.class);
assertThat(ClassPathManager.getClass("Registrar")).isEqualTo(Registrar.class);
assertThat(ClassPathManager.getClass("Contact")).isEqualTo(Contact.class); assertThat(ClassPathManager.getClass("Contact")).isEqualTo(Contact.class);
assertThat(ClassPathManager.getClass("GaeUserIdConverter")).isEqualTo(GaeUserIdConverter.class); assertThat(ClassPathManager.getClass("GaeUserIdConverter")).isEqualTo(GaeUserIdConverter.class);
assertThat(ClassPathManager.getClass("EppResourceIndexBucket")) assertThat(ClassPathManager.getClass("EppResourceIndexBucket"))
@ -99,7 +97,6 @@ public class ClassPathManagerTest {
assertThat(ClassPathManager.getClassName(ForeignKeyContactIndex.class)) assertThat(ClassPathManager.getClassName(ForeignKeyContactIndex.class))
.isEqualTo("ForeignKeyContactIndex"); .isEqualTo("ForeignKeyContactIndex");
assertThat(ClassPathManager.getClassName(Host.class)).isEqualTo("Host"); assertThat(ClassPathManager.getClassName(Host.class)).isEqualTo("Host");
assertThat(ClassPathManager.getClassName(Registrar.class)).isEqualTo("Registrar");
assertThat(ClassPathManager.getClassName(Contact.class)).isEqualTo("Contact"); assertThat(ClassPathManager.getClassName(Contact.class)).isEqualTo("Contact");
assertThat(ClassPathManager.getClassName(GaeUserIdConverter.class)) assertThat(ClassPathManager.getClassName(GaeUserIdConverter.class))
.isEqualTo("GaeUserIdConverter"); .isEqualTo("GaeUserIdConverter");

View file

@ -28,13 +28,13 @@ import static org.joda.time.DateTimeZone.UTC;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key; import google.registry.model.ImmutableObject;
import google.registry.model.host.Host; import google.registry.model.host.Host;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.persistence.VKey; import google.registry.persistence.VKey;
import google.registry.testing.AppEngineExtension; import google.registry.testing.AppEngineExtension;
import java.util.Arrays;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -119,19 +119,20 @@ public class MutatingCommandTest {
@Test @Test
void testSuccess_create() throws Exception { void testSuccess_create() throws Exception {
ImmutableList<VKey<?>> keys = ImmutableList<VKey<?>> keys =
Arrays.asList(host1, host2, registrar1, registrar2).stream() Stream.of(host1, host2, registrar1, registrar2)
.map(entity -> VKey.from(Key.create(entity))) .map(ImmutableObject::createVKey)
.collect(toImmutableList()); .collect(toImmutableList());
tm().transact(() -> tm().delete(keys)); tm().transact(() -> tm().delete(keys));
MutatingCommand command = new MutatingCommand() { MutatingCommand command =
@Override new MutatingCommand() {
protected void init() { @Override
stageEntityChange(null, newHost1); protected void init() {
stageEntityChange(null, newHost2); stageEntityChange(null, newHost1);
stageEntityChange(null, newRegistrar1); stageEntityChange(null, newHost2);
stageEntityChange(null, newRegistrar2); stageEntityChange(null, newRegistrar1);
} stageEntityChange(null, newRegistrar2);
}; }
};
command.init(); command.init();
String changes = command.prompt(); String changes = command.prompt();
assertThat(changes) assertThat(changes)

View file

@ -366,7 +366,7 @@ class SetupOteCommandTest extends CommandTestCase<SetupOteCommand> {
"--registrar=blobio", "--registrar=blobio",
"--email=contact@email.com", "--email=contact@email.com",
"--certfile=" + getCertFilename())); "--certfile=" + getCertFilename()));
assertThat(thrown).hasMessageThat().contains("VKey<Registrar>(sql:blobio-1,ofy:blobio-1)"); assertThat(thrown).hasMessageThat().contains("VKey<Registrar>(sql:blobio-1)");
} }
@Test @Test

View file

@ -312,54 +312,6 @@ class google.registry.model.index.ForeignKeyIndex$ForeignKeyHostIndex {
google.registry.persistence.VKey<E> topReference; google.registry.persistence.VKey<E> topReference;
org.joda.time.DateTime deletionTime; org.joda.time.DateTime deletionTime;
} }
class google.registry.model.registrar.Registrar {
@Id java.lang.String clientIdentifier;
@Parent com.googlecode.objectify.Key<google.registry.model.common.EntityGroupRoot> parent;
boolean blockPremiumNames;
boolean contactsRequireSyncing;
boolean registryLockAllowed;
google.registry.model.registrar.Registrar$State state;
google.registry.model.registrar.Registrar$Type type;
java.lang.Long ianaIdentifier;
java.lang.String clientCertificate;
java.lang.String clientCertificateHash;
java.lang.String driveFolderId;
java.lang.String emailAddress;
java.lang.String failoverClientCertificate;
java.lang.String failoverClientCertificateHash;
java.lang.String faxNumber;
java.lang.String icannReferralEmail;
java.lang.String passwordHash;
java.lang.String phoneNumber;
java.lang.String phonePasscode;
java.lang.String poNumber;
java.lang.String registrarName;
java.lang.String salt;
java.lang.String url;
java.lang.String whoisServer;
java.util.List<google.registry.util.CidrAddressBlock> ipAddressWhitelist;
java.util.Map<org.joda.money.CurrencyUnit, java.lang.String> billingAccountMap;
java.util.Set<java.lang.String> allowedTlds;
java.util.Set<java.lang.String> rdapBaseUrls;
org.joda.time.DateTime lastCertificateUpdateTime;
org.joda.time.DateTime lastExpiringCertNotificationSentDate;
org.joda.time.DateTime lastExpiringFailoverCertNotificationSentDate;
}
enum google.registry.model.registrar.Registrar$State {
ACTIVE;
DISABLED;
PENDING;
SUSPENDED;
}
enum google.registry.model.registrar.Registrar$Type {
EXTERNAL_MONITORING;
INTERNAL;
MONITORING;
OTE;
PDT;
REAL;
TEST;
}
class google.registry.model.reporting.DomainTransactionRecord { class google.registry.model.reporting.DomainTransactionRecord {
google.registry.model.reporting.DomainTransactionRecord$TransactionReportField reportField; google.registry.model.reporting.DomainTransactionRecord$TransactionReportField reportField;
java.lang.Integer reportAmount; java.lang.Integer reportAmount;