diff --git a/core/src/main/java/google/registry/model/domain/DomainContent.java b/core/src/main/java/google/registry/model/domain/DomainContent.java index 6fbb2d626..bafc897cc 100644 --- a/core/src/main/java/google/registry/model/domain/DomainContent.java +++ b/core/src/main/java/google/registry/model/domain/DomainContent.java @@ -311,6 +311,9 @@ public class DomainContent extends EppResource nullToEmptyImmutableCopy(gracePeriods).stream() .map(gracePeriod -> gracePeriod.cloneAfterOfyLoad(getRepoId())) .collect(toImmutableSet()); + // TODO(b/169873747): Remove this method after explicitly re-saving all domain entities. + // See also: GradePeriod.onLoad. + gracePeriods.forEach(GracePeriod::onLoad); // Restore history record ids. autorenewPollMessageHistoryId = getHistoryId(autorenewPollMessage); 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 7c860e8ea..e9c860f91 100644 --- a/core/src/main/java/google/registry/model/domain/GracePeriod.java +++ b/core/src/main/java/google/registry/model/domain/GracePeriod.java @@ -19,7 +19,6 @@ import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; import com.google.common.annotations.VisibleForTesting; import com.googlecode.objectify.annotation.Embed; -import com.googlecode.objectify.annotation.OnLoad; import google.registry.model.billing.BillingEvent; import google.registry.model.billing.BillingEvent.Recurring; import google.registry.model.domain.rgp.GracePeriodStatus; @@ -54,7 +53,10 @@ public class GracePeriod extends GracePeriodBase implements DatastoreAndSqlEntit } // TODO(b/169873747): Remove this method after explicitly re-saving all domain entities. - @OnLoad + // This method is invoked from DomainContent.load(): Objectify's @OnLoad annotation + // apparently does not work on embedded objects inside an entity. + // Changing signature to void onLoad(@AlsoLoad("gracePeriodId") Long gracePeriodId) + // would not work. Method is not called if gracePeriodId is null. void onLoad() { if (gracePeriodId == null) { gracePeriodId = ObjectifyService.allocateId(); diff --git a/core/src/test/java/google/registry/model/domain/DomainBaseTest.java b/core/src/test/java/google/registry/model/domain/DomainBaseTest.java index 891a417fe..d64c9934e 100644 --- a/core/src/test/java/google/registry/model/domain/DomainBaseTest.java +++ b/core/src/test/java/google/registry/model/domain/DomainBaseTest.java @@ -19,6 +19,8 @@ import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth8.assertThat; import static google.registry.model.EppResourceUtils.loadByForeignKey; +import static google.registry.model.ofy.ObjectifyService.ofy; +import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm; import static google.registry.testing.DatabaseHelper.cloneAndSetAutoTimestamps; import static google.registry.testing.DatabaseHelper.createTld; import static google.registry.testing.DatabaseHelper.newDomainBase; @@ -30,6 +32,7 @@ import static org.joda.money.CurrencyUnit.USD; import static org.joda.time.DateTimeZone.UTC; import static org.junit.jupiter.api.Assertions.assertThrows; +import com.google.appengine.api.datastore.Entity; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedMap; @@ -164,6 +167,15 @@ public class DomainBaseTest extends EntityTestCase { .build())); } + @Test + void testGracePeriod_nullIdFromOfy() { + Entity entity = ofyTm().transact(() -> ofy().save().toEntity(domain)); + entity.setUnindexedProperty("gracePeriods.gracePeriodId", null); + DomainBase domainFromEntity = ofyTm().transact(() -> ofy().load().fromEntity(entity)); + GracePeriod gracePeriod = domainFromEntity.getGracePeriods().iterator().next(); + assertThat(gracePeriod.gracePeriodId).isNotNull(); + } + @Test void testPersistence() { // Note that this only verifies that the value stored under the foreign key is the same as that