From 0f09a4a0abe90d928ef7ea80cd1533224adced51 Mon Sep 17 00:00:00 2001 From: gbrodman Date: Mon, 5 Oct 2020 13:07:53 -0400 Subject: [PATCH] Add more Datastore/Sql Entity annotations (#826) * Add more Datastore/Sql Entity annotations * Move comments up a line --- .../java/google/registry/model/OteAccountBuilder.java | 3 ++- .../google/registry/model/contact/ContactHistory.java | 11 ++++++++++- .../google/registry/model/domain/DomainHistory.java | 11 ++++++++++- .../google/registry/model/domain/GracePeriod.java | 3 ++- .../model/domain/secdns/DelegationSignerData.java | 3 ++- .../java/google/registry/model/host/HostHistory.java | 11 ++++++++++- .../java/google/registry/model/registry/Registry.java | 3 ++- .../model/reporting/DomainTransactionRecord.java | 4 +++- .../google/registry/model/reporting/HistoryEntry.java | 10 ++-------- .../google/registry/model/tmch/ClaimsListShard.java | 8 ++------ .../google/registry/schema/replay/EntityTest.java | 2 ++ 11 files changed, 47 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/google/registry/model/OteAccountBuilder.java b/core/src/main/java/google/registry/model/OteAccountBuilder.java index 24f276073..325c84d15 100644 --- a/core/src/main/java/google/registry/model/OteAccountBuilder.java +++ b/core/src/main/java/google/registry/model/OteAccountBuilder.java @@ -252,7 +252,8 @@ public final class OteAccountBuilder { private void saveAllEntities() { tm().assertInTransaction(); - ImmutableList registries = ImmutableList.of(sunriseTld, gaTld, eapTld); + // use ImmutableObject instead of Registry so that the Key generation doesn't break + ImmutableList registries = ImmutableList.of(sunriseTld, gaTld, eapTld); ImmutableList contacts = contactsBuilder.build(); if (!replaceExisting) { diff --git a/core/src/main/java/google/registry/model/contact/ContactHistory.java b/core/src/main/java/google/registry/model/contact/ContactHistory.java index 829952d32..d7238785c 100644 --- a/core/src/main/java/google/registry/model/contact/ContactHistory.java +++ b/core/src/main/java/google/registry/model/contact/ContactHistory.java @@ -14,6 +14,7 @@ package google.registry.model.contact; +import com.google.common.collect.ImmutableList; import com.googlecode.objectify.Key; import com.googlecode.objectify.annotation.EntitySubclass; import google.registry.model.EppResource; @@ -21,6 +22,8 @@ import google.registry.model.ImmutableObject; import google.registry.model.contact.ContactHistory.ContactHistoryId; import google.registry.model.reporting.HistoryEntry; import google.registry.persistence.VKey; +import google.registry.schema.replay.DatastoreEntity; +import google.registry.schema.replay.SqlEntity; import java.io.Serializable; import java.util.Optional; import javax.annotation.Nullable; @@ -52,7 +55,7 @@ import javax.persistence.PostLoad; @EntitySubclass @Access(AccessType.FIELD) @IdClass(ContactHistoryId.class) -public class ContactHistory extends HistoryEntry { +public class ContactHistory extends HistoryEntry implements SqlEntity { // Store ContactBase instead of ContactResource so we don't pick up its @Id @Nullable ContactBase contactBase; @@ -101,6 +104,12 @@ public class ContactHistory extends HistoryEntry { parent = Key.create(ContactResource.class, contactRepoId); } + // In Datastore, save as a HistoryEntry object regardless of this object's type + @Override + public ImmutableList toDatastoreEntities() { + return ImmutableList.of(asHistoryEntry()); + } + /** Class to represent the composite primary key of {@link ContactHistory} entity. */ static class ContactHistoryId extends ImmutableObject implements Serializable { diff --git a/core/src/main/java/google/registry/model/domain/DomainHistory.java b/core/src/main/java/google/registry/model/domain/DomainHistory.java index d3402ff09..677ff005c 100644 --- a/core/src/main/java/google/registry/model/domain/DomainHistory.java +++ b/core/src/main/java/google/registry/model/domain/DomainHistory.java @@ -16,6 +16,7 @@ package google.registry.model.domain; import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy; +import com.google.common.collect.ImmutableList; import com.googlecode.objectify.Key; import com.googlecode.objectify.annotation.EntitySubclass; import com.googlecode.objectify.annotation.Ignore; @@ -26,6 +27,8 @@ import google.registry.model.host.HostResource; import google.registry.model.reporting.DomainTransactionRecord; import google.registry.model.reporting.HistoryEntry; import google.registry.persistence.VKey; +import google.registry.schema.replay.DatastoreEntity; +import google.registry.schema.replay.SqlEntity; import java.io.Serializable; import java.util.Optional; import java.util.Set; @@ -65,7 +68,7 @@ import javax.persistence.Table; @EntitySubclass @Access(AccessType.FIELD) @IdClass(DomainHistoryId.class) -public class DomainHistory extends HistoryEntry { +public class DomainHistory extends HistoryEntry implements SqlEntity { // Store DomainContent instead of DomainBase so we don't pick up its @Id @Nullable DomainContent domainContent; @@ -172,6 +175,12 @@ public class DomainHistory extends HistoryEntry { parent = Key.create(DomainBase.class, domainRepoId); } + // In Datastore, save as a HistoryEntry object regardless of this object's type + @Override + public ImmutableList toDatastoreEntities() { + return ImmutableList.of(asHistoryEntry()); + } + /** Class to represent the composite primary key of {@link DomainHistory} entity. */ static class DomainHistoryId extends ImmutableObject implements Serializable { diff --git a/core/src/main/java/google/registry/model/domain/GracePeriod.java b/core/src/main/java/google/registry/model/domain/GracePeriod.java index b002373e2..9070aa157 100644 --- a/core/src/main/java/google/registry/model/domain/GracePeriod.java +++ b/core/src/main/java/google/registry/model/domain/GracePeriod.java @@ -22,6 +22,7 @@ import google.registry.model.billing.BillingEvent; import google.registry.model.billing.BillingEvent.Recurring; import google.registry.model.domain.rgp.GracePeriodStatus; import google.registry.persistence.VKey; +import google.registry.schema.replay.DatastoreAndSqlEntity; import javax.annotation.Nullable; import javax.persistence.Entity; import javax.persistence.Index; @@ -37,7 +38,7 @@ import org.joda.time.DateTime; @Embed @Entity @Table(indexes = @Index(columnList = "domainRepoId")) -public class GracePeriod extends GracePeriodBase { +public class GracePeriod extends GracePeriodBase implements DatastoreAndSqlEntity { private static GracePeriod createInternal( GracePeriodStatus type, diff --git a/core/src/main/java/google/registry/model/domain/secdns/DelegationSignerData.java b/core/src/main/java/google/registry/model/domain/secdns/DelegationSignerData.java index 62ffc49c3..1b4e0ea53 100644 --- a/core/src/main/java/google/registry/model/domain/secdns/DelegationSignerData.java +++ b/core/src/main/java/google/registry/model/domain/secdns/DelegationSignerData.java @@ -16,6 +16,7 @@ package google.registry.model.domain.secdns; import com.googlecode.objectify.annotation.Embed; import google.registry.model.ImmutableObject; +import google.registry.schema.replay.DatastoreAndSqlEntity; import javax.xml.bind.DatatypeConverter; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; @@ -31,7 +32,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @Embed @XmlType(name = "dsData") @javax.persistence.Entity -public class DelegationSignerData extends ImmutableObject { +public class DelegationSignerData extends ImmutableObject implements DatastoreAndSqlEntity { private DelegationSignerData() {} diff --git a/core/src/main/java/google/registry/model/host/HostHistory.java b/core/src/main/java/google/registry/model/host/HostHistory.java index 0490411bf..dc4019be4 100644 --- a/core/src/main/java/google/registry/model/host/HostHistory.java +++ b/core/src/main/java/google/registry/model/host/HostHistory.java @@ -15,6 +15,7 @@ package google.registry.model.host; +import com.google.common.collect.ImmutableList; import com.googlecode.objectify.Key; import com.googlecode.objectify.annotation.EntitySubclass; import google.registry.model.EppResource; @@ -22,6 +23,8 @@ import google.registry.model.ImmutableObject; import google.registry.model.host.HostHistory.HostHistoryId; import google.registry.model.reporting.HistoryEntry; import google.registry.persistence.VKey; +import google.registry.schema.replay.DatastoreEntity; +import google.registry.schema.replay.SqlEntity; import java.io.Serializable; import java.util.Optional; import javax.annotation.Nullable; @@ -54,7 +57,7 @@ import javax.persistence.PostLoad; @EntitySubclass @Access(AccessType.FIELD) @IdClass(HostHistoryId.class) -public class HostHistory extends HistoryEntry { +public class HostHistory extends HistoryEntry implements SqlEntity { // Store HostBase instead of HostResource so we don't pick up its @Id @Nullable HostBase hostBase; @@ -101,6 +104,12 @@ public class HostHistory extends HistoryEntry { parent = Key.create(HostResource.class, hostRepoId); } + // In Datastore, save as a HistoryEntry object regardless of this object's type + @Override + public ImmutableList toDatastoreEntities() { + return ImmutableList.of(asHistoryEntry()); + } + /** Class to represent the composite primary key of {@link HostHistory} entity. */ static class HostHistoryId extends ImmutableObject implements Serializable { diff --git a/core/src/main/java/google/registry/model/registry/Registry.java b/core/src/main/java/google/registry/model/registry/Registry.java index 605dc2fa4..bbbfa241a 100644 --- a/core/src/main/java/google/registry/model/registry/Registry.java +++ b/core/src/main/java/google/registry/model/registry/Registry.java @@ -62,6 +62,7 @@ import google.registry.model.domain.fee.BaseFee.FeeType; import google.registry.model.domain.fee.Fee; import google.registry.model.registry.label.PremiumList; import google.registry.model.registry.label.ReservedList; +import google.registry.schema.replay.DatastoreAndSqlEntity; import google.registry.util.Idn; import java.util.Map; import java.util.Optional; @@ -86,7 +87,7 @@ import org.joda.time.Duration; @ReportedOn @Entity @javax.persistence.Entity(name = "Tld") -public class Registry extends ImmutableObject implements Buildable { +public class Registry extends ImmutableObject implements Buildable, DatastoreAndSqlEntity { @Parent @Transient Key parent = getCrossTldKey(); diff --git a/core/src/main/java/google/registry/model/reporting/DomainTransactionRecord.java b/core/src/main/java/google/registry/model/reporting/DomainTransactionRecord.java index 1259ba4a5..74b2f3adf 100644 --- a/core/src/main/java/google/registry/model/reporting/DomainTransactionRecord.java +++ b/core/src/main/java/google/registry/model/reporting/DomainTransactionRecord.java @@ -22,6 +22,7 @@ import com.googlecode.objectify.annotation.Embed; import com.googlecode.objectify.annotation.Ignore; import google.registry.model.Buildable; import google.registry.model.ImmutableObject; +import google.registry.schema.replay.DatastoreAndSqlEntity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -43,7 +44,8 @@ import org.joda.time.DateTime; */ @Embed @Entity -public class DomainTransactionRecord extends ImmutableObject implements Buildable { +public class DomainTransactionRecord extends ImmutableObject + implements Buildable, DatastoreAndSqlEntity { @Id @Ignore diff --git a/core/src/main/java/google/registry/model/reporting/HistoryEntry.java b/core/src/main/java/google/registry/model/reporting/HistoryEntry.java index 759cb653f..6e9d3c156 100644 --- a/core/src/main/java/google/registry/model/reporting/HistoryEntry.java +++ b/core/src/main/java/google/registry/model/reporting/HistoryEntry.java @@ -62,7 +62,7 @@ import org.joda.time.DateTime; @MappedSuperclass @WithStringVKey // TODO(b/162229294): This should be resolved during the course of that bug @Access(AccessType.FIELD) -public class HistoryEntry extends ImmutableObject implements Buildable, DatastoreEntity, SqlEntity { +public class HistoryEntry extends ImmutableObject implements Buildable, DatastoreEntity { /** Represents the type of history entry. */ public enum Type { @@ -322,13 +322,7 @@ public class HistoryEntry extends ImmutableObject implements Buildable, Datastor // In SQL, save the child type @Override public ImmutableList toSqlEntities() { - return ImmutableList.of(toChildHistoryEntity()); - } - - // In Datastore, save as a HistoryEntry object regardless of this object's type - @Override - public ImmutableList toDatastoreEntities() { - return ImmutableList.of(asHistoryEntry()); + return ImmutableList.of((SqlEntity) toChildHistoryEntity()); } /** A builder for {@link HistoryEntry} since it is immutable */ diff --git a/core/src/main/java/google/registry/model/tmch/ClaimsListShard.java b/core/src/main/java/google/registry/model/tmch/ClaimsListShard.java index 98b4292a4..ed6419841 100644 --- a/core/src/main/java/google/registry/model/tmch/ClaimsListShard.java +++ b/core/src/main/java/google/registry/model/tmch/ClaimsListShard.java @@ -46,6 +46,7 @@ import google.registry.model.annotations.NotBackedUp; import google.registry.model.annotations.NotBackedUp.Reason; import google.registry.model.annotations.VirtualEntity; import google.registry.model.common.CrossTldSingleton; +import google.registry.schema.replay.DatastoreAndSqlEntity; import google.registry.schema.replay.DatastoreEntity; import google.registry.schema.replay.SqlEntity; import google.registry.util.CollectionUtils; @@ -97,7 +98,7 @@ import org.joda.time.DateTime; @NotBackedUp(reason = Reason.EXTERNALLY_SOURCED) @javax.persistence.Entity(name = "ClaimsList") @Table -public class ClaimsListShard extends ImmutableObject implements DatastoreEntity { +public class ClaimsListShard extends ImmutableObject implements DatastoreAndSqlEntity { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); @@ -354,11 +355,6 @@ public class ClaimsListShard extends ImmutableObject implements DatastoreEntity } } - @Override - public ImmutableList toSqlEntities() { - return ImmutableList.of(); // ClaimsLists are dually written - } - /** Virtual parent entity for claims list shards of a specific revision. */ @Entity @VirtualEntity diff --git a/core/src/test/java/google/registry/schema/replay/EntityTest.java b/core/src/test/java/google/registry/schema/replay/EntityTest.java index 51463d102..3722c5595 100644 --- a/core/src/test/java/google/registry/schema/replay/EntityTest.java +++ b/core/src/test/java/google/registry/schema/replay/EntityTest.java @@ -18,6 +18,7 @@ import static com.google.common.collect.ImmutableSet.toImmutableSet; import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableSet; +import com.googlecode.objectify.annotation.Embed; import io.github.classgraph.ClassGraph; import io.github.classgraph.ClassInfo; import io.github.classgraph.ClassInfoList; @@ -72,6 +73,7 @@ public class EntityTest { .filter(ClassInfo::isStandardClass) .map(ClassInfo::loadClass) .filter(clazz -> !clazz.isAnnotationPresent(EntityForTesting.class)) + .filter(clazz -> !clazz.isAnnotationPresent(Embed.class)) .map(Class::getName) .collect(toImmutableSet()); }