From 57592d787cd0238ff7423fa7d40b4111b589ee5e Mon Sep 17 00:00:00 2001 From: Ben McIlwain Date: Mon, 28 Aug 2023 17:04:41 -0400 Subject: [PATCH] Add a new MutatingFlow interface and make most flows use TransactionalFlow (#2129) The old semantics for TransactionalFlow meant "anything that needs to mutate the database", but then FlowRunner was not creating transactions for non-transactional flows even though nearly every flow needs a transaction (as nearly every flow needs to hit the database for some purpose). So now TransactionalFlow simply means "any flow that needs the database", and MutatingFlow means "a flow that mutates the database". In the future we will have FlowRunner use a read-only transaction for TransactionalFlow and then a normal writes-allowed transaction for MutatingFlow. That is a TODO. This also fixes up some transact() calls inside caches to be reTransact(), as we rightly can't move the transaction outside them as from some callsites we legitimately do not know whether a transaction will be needed at all (depending on whether said data is already in memory). And it removes the replicaTm() calls which weren't actually doing anything as they were always nested inside of normal tm()s, thus causing confusion. --- .../google/registry/flows/FlowRunner.java | 2 + .../google/registry/flows/MutatingFlow.java | 23 +++++++++++ .../registry/flows/ResourceFlowUtils.java | 19 ++++----- .../flows/contact/ContactCheckFlow.java | 4 +- .../flows/contact/ContactCreateFlow.java | 4 +- .../flows/contact/ContactDeleteFlow.java | 4 +- .../flows/contact/ContactInfoFlow.java | 4 +- .../contact/ContactTransferApproveFlow.java | 4 +- .../contact/ContactTransferCancelFlow.java | 4 +- .../contact/ContactTransferQueryFlow.java | 4 +- .../contact/ContactTransferRejectFlow.java | 4 +- .../contact/ContactTransferRequestFlow.java | 4 +- .../flows/contact/ContactUpdateFlow.java | 4 +- .../flows/domain/DomainCheckFlow.java | 22 ++++------ .../flows/domain/DomainClaimsCheckFlow.java | 8 ++-- .../flows/domain/DomainCreateFlow.java | 4 +- .../flows/domain/DomainDeleteFlow.java | 4 +- .../registry/flows/domain/DomainInfoFlow.java | 12 +++--- .../flows/domain/DomainRenewFlow.java | 4 +- .../domain/DomainRestoreRequestFlow.java | 4 +- .../domain/DomainTransferApproveFlow.java | 4 +- .../domain/DomainTransferCancelFlow.java | 4 +- .../flows/domain/DomainTransferQueryFlow.java | 4 +- .../domain/DomainTransferRejectFlow.java | 4 +- .../domain/DomainTransferRequestFlow.java | 4 +- .../flows/domain/DomainUpdateFlow.java | 4 +- .../registry/flows/host/HostCheckFlow.java | 4 +- .../registry/flows/host/HostCreateFlow.java | 4 +- .../registry/flows/host/HostDeleteFlow.java | 4 +- .../registry/flows/host/HostInfoFlow.java | 7 ++-- .../registry/flows/host/HostUpdateFlow.java | 4 +- .../registry/flows/poll/PollAckFlow.java | 4 +- .../registry/flows/poll/PollRequestFlow.java | 41 +++++++++---------- .../registry/flows/session/LoginFlow.java | 4 +- .../google/registry/model/EppResource.java | 9 ++-- .../registry/model/ForeignKeyUtils.java | 2 +- .../google/registry/flows/FlowTestCase.java | 10 ++--- .../flows/ResourceCheckFlowTestCase.java | 2 +- .../flows/contact/ContactCreateFlowTest.java | 2 +- .../flows/contact/ContactDeleteFlowTest.java | 6 +-- .../flows/contact/ContactInfoFlowTest.java | 12 +++--- .../ContactTransferApproveFlowTest.java | 4 +- .../ContactTransferCancelFlowTest.java | 4 +- .../contact/ContactTransferQueryFlowTest.java | 4 +- .../ContactTransferRejectFlowTest.java | 4 +- .../ContactTransferRequestFlowTest.java | 4 +- .../flows/contact/ContactUpdateFlowTest.java | 2 +- .../domain/DomainClaimsCheckFlowTest.java | 4 +- .../flows/domain/DomainCreateFlowTest.java | 4 +- .../flows/domain/DomainDeleteFlowTest.java | 4 +- .../flows/domain/DomainInfoFlowTest.java | 2 +- .../flows/domain/DomainRenewFlowTest.java | 2 +- .../domain/DomainRestoreRequestFlowTest.java | 4 +- .../domain/DomainTransferApproveFlowTest.java | 4 +- .../domain/DomainTransferCancelFlowTest.java | 4 +- .../domain/DomainTransferQueryFlowTest.java | 4 +- .../domain/DomainTransferRejectFlowTest.java | 4 +- .../domain/DomainTransferRequestFlowTest.java | 8 ++-- .../flows/domain/DomainUpdateFlowTest.java | 8 ++-- .../flows/host/HostCreateFlowTest.java | 2 +- .../flows/host/HostDeleteFlowTest.java | 4 +- .../registry/flows/host/HostInfoFlowTest.java | 6 +-- .../flows/host/HostUpdateFlowTest.java | 2 +- .../registry/flows/poll/PollAckFlowTest.java | 30 +++++++------- .../flows/poll/PollRequestFlowTest.java | 20 ++++----- .../registry/flows/session/HelloFlowTest.java | 2 +- .../flows/session/LoginFlowTestCase.java | 6 +-- .../flows/session/LogoutFlowTest.java | 2 +- 68 files changed, 218 insertions(+), 211 deletions(-) create mode 100644 core/src/main/java/google/registry/flows/MutatingFlow.java diff --git a/core/src/main/java/google/registry/flows/FlowRunner.java b/core/src/main/java/google/registry/flows/FlowRunner.java index 405f3714d..d1ea079e6 100644 --- a/core/src/main/java/google/registry/flows/FlowRunner.java +++ b/core/src/main/java/google/registry/flows/FlowRunner.java @@ -78,6 +78,8 @@ public class FlowRunner { return EppOutput.create(flowProvider.get().run()); } try { + // TODO(mcilwain/weiminyu): Use transactReadOnly() here for TransactionalFlow and transact() + // for MutatingFlow. return tm().transact( () -> { try { diff --git a/core/src/main/java/google/registry/flows/MutatingFlow.java b/core/src/main/java/google/registry/flows/MutatingFlow.java new file mode 100644 index 000000000..49ab36e11 --- /dev/null +++ b/core/src/main/java/google/registry/flows/MutatingFlow.java @@ -0,0 +1,23 @@ +// Copyright 2023 The Nomulus Authors. 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 google.registry.flows; + +/** + * Interface for a {@link TransactionalFlow} that mutates the database (i.e. is not read-only). + * + *

Any flow that mutates the DB should implement this so that {@link FlowRunner} will know how to + * run it. + */ +public interface MutatingFlow extends TransactionalFlow {} diff --git a/core/src/main/java/google/registry/flows/ResourceFlowUtils.java b/core/src/main/java/google/registry/flows/ResourceFlowUtils.java index 9f1f1a9c5..33551927a 100644 --- a/core/src/main/java/google/registry/flows/ResourceFlowUtils.java +++ b/core/src/main/java/google/registry/flows/ResourceFlowUtils.java @@ -72,17 +72,12 @@ public final class ResourceFlowUtils { */ public static void checkLinkedDomains( final String targetId, final DateTime now, final Class resourceClass) throws EppException { - EppException failfastException = - tm().transact( - () -> { - VKey key = ForeignKeyUtils.load(resourceClass, targetId, now); - if (key == null) { - return new ResourceDoesNotExistException(resourceClass, targetId); - } - return isLinked(key, now) ? new ResourceToDeleteIsReferencedException() : null; - }); - if (failfastException != null) { - throw failfastException; + VKey key = ForeignKeyUtils.load(resourceClass, targetId, now); + if (key == null) { + throw new ResourceDoesNotExistException(resourceClass, targetId); + } + if (isLinked(key, now)) { + throw new ResourceToDeleteIsReferencedException(); } } @@ -169,7 +164,7 @@ public final class ResourceFlowUtils { throw new BadAuthInfoForResourceException(); } // Check the authInfo against the contact. - verifyAuthInfo(authInfo, tm().transact(() -> tm().loadByKey(foundContact.get()))); + verifyAuthInfo(authInfo, tm().loadByKey(foundContact.get())); } /** Check that the given {@link AuthInfo} is valid for the given contact. */ diff --git a/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java b/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java index 7f799c4c6..7ed71c299 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java @@ -23,8 +23,8 @@ import com.google.common.collect.ImmutableSet; import google.registry.config.RegistryConfig.Config; import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; +import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.contact.Contact; import google.registry.model.contact.ContactCommand.Check; @@ -45,7 +45,7 @@ import javax.inject.Inject; * @error {@link google.registry.flows.FlowUtils.NotLoggedInException} */ @ReportingSpec(ActivityReportField.CONTACT_CHECK) -public final class ContactCheckFlow implements Flow { +public final class ContactCheckFlow implements TransactionalFlow { @Inject ResourceCommand resourceCommand; @Inject @RegistrarId String registrarId; diff --git a/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java b/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java index da5020954..6ebea8cd8 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java @@ -28,7 +28,7 @@ import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ResourceAlreadyExistsForThisClientException; import google.registry.flows.exceptions.ResourceCreateContentionException; @@ -54,7 +54,7 @@ import org.joda.time.DateTime; * @error {@link ContactFlowUtils.DeclineContactDisclosureFieldDisallowedPolicyException} */ @ReportingSpec(ActivityReportField.CONTACT_CREATE) -public final class ContactCreateFlow implements TransactionalFlow { +public final class ContactCreateFlow implements MutatingFlow { @Inject ResourceCommand resourceCommand; @Inject ExtensionManager extensionManager; diff --git a/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java b/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java index 4e55cb6ce..5983783ee 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java @@ -32,7 +32,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.contact.Contact; import google.registry.model.contact.ContactHistory; @@ -63,7 +63,7 @@ import org.joda.time.DateTime; * @error {@link google.registry.flows.exceptions.ResourceToDeleteIsReferencedException} */ @ReportingSpec(ActivityReportField.CONTACT_DELETE) -public final class ContactDeleteFlow implements TransactionalFlow { +public final class ContactDeleteFlow implements MutatingFlow { private static final ImmutableSet DISALLOWED_STATUSES = ImmutableSet.of( diff --git a/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java b/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java index d749c51c4..88994949a 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java @@ -22,10 +22,10 @@ import static google.registry.model.EppResourceUtils.isLinked; import com.google.common.collect.ImmutableSet; import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; +import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.contact.Contact; import google.registry.model.contact.ContactInfoData; @@ -51,7 +51,7 @@ import org.joda.time.DateTime; * @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException} */ @ReportingSpec(ActivityReportField.CONTACT_INFO) -public final class ContactInfoFlow implements Flow { +public final class ContactInfoFlow implements TransactionalFlow { @Inject ExtensionManager extensionManager; @Inject Clock clock; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java index 8b4ad9bc8..7e2c4bdd0 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java @@ -30,7 +30,7 @@ import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.contact.Contact; import google.registry.model.contact.ContactHistory; @@ -60,7 +60,7 @@ import org.joda.time.DateTime; * @error {@link google.registry.flows.exceptions.NotPendingTransferException} */ @ReportingSpec(ActivityReportField.CONTACT_TRANSFER_APPROVE) -public final class ContactTransferApproveFlow implements TransactionalFlow { +public final class ContactTransferApproveFlow implements MutatingFlow { @Inject ResourceCommand resourceCommand; @Inject ExtensionManager extensionManager; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java index 4d3f79f38..6128759f6 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java @@ -30,7 +30,7 @@ import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.contact.Contact; import google.registry.model.contact.ContactHistory; @@ -60,7 +60,7 @@ import org.joda.time.DateTime; * @error {@link google.registry.flows.exceptions.NotTransferInitiatorException} */ @ReportingSpec(ActivityReportField.CONTACT_TRANSFER_CANCEL) -public final class ContactTransferCancelFlow implements TransactionalFlow { +public final class ContactTransferCancelFlow implements MutatingFlow { @Inject ResourceCommand resourceCommand; @Inject ExtensionManager extensionManager; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java index f92a959a2..305bb69c0 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java @@ -21,9 +21,9 @@ import static google.registry.flows.contact.ContactFlowUtils.createTransferRespo import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.TargetId; +import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.NoTransferHistoryToQueryException; import google.registry.flows.exceptions.NotAuthorizedToViewTransferException; @@ -52,7 +52,7 @@ import javax.inject.Inject; * @error {@link google.registry.flows.exceptions.NotAuthorizedToViewTransferException} */ @ReportingSpec(ActivityReportField.CONTACT_TRANSFER_QUERY) -public final class ContactTransferQueryFlow implements Flow { +public final class ContactTransferQueryFlow implements TransactionalFlow { @Inject ExtensionManager extensionManager; @Inject Optional authInfo; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java index b1c6968fa..906311919 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java @@ -30,7 +30,7 @@ import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.contact.Contact; import google.registry.model.contact.ContactHistory; @@ -59,7 +59,7 @@ import org.joda.time.DateTime; * @error {@link google.registry.flows.exceptions.NotPendingTransferException} */ @ReportingSpec(ActivityReportField.CONTACT_TRANSFER_REJECT) -public final class ContactTransferRejectFlow implements TransactionalFlow { +public final class ContactTransferRejectFlow implements MutatingFlow { @Inject ExtensionManager extensionManager; @Inject Optional authInfo; diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java index 0817140f9..0a5b48e1e 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java @@ -33,7 +33,7 @@ import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.AlreadyPendingTransferException; import google.registry.flows.exceptions.ObjectAlreadySponsoredException; @@ -72,7 +72,7 @@ import org.joda.time.Duration; * @error {@link google.registry.flows.exceptions.ResourceStatusProhibitsOperationException} */ @ReportingSpec(ActivityReportField.CONTACT_TRANSFER_REQUEST) -public final class ContactTransferRequestFlow implements TransactionalFlow { +public final class ContactTransferRequestFlow implements MutatingFlow { private static final ImmutableSet DISALLOWED_STATUSES = ImmutableSet.of( diff --git a/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java b/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java index 40abc1909..63d510516 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java @@ -33,7 +33,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ResourceHasClientUpdateProhibitedException; import google.registry.model.contact.Contact; @@ -66,7 +66,7 @@ import org.joda.time.DateTime; * @error {@link ContactFlowUtils.DeclineContactDisclosureFieldDisallowedPolicyException} */ @ReportingSpec(ActivityReportField.CONTACT_UPDATE) -public final class ContactUpdateFlow implements TransactionalFlow { +public final class ContactUpdateFlow implements MutatingFlow { /** * Note that CLIENT_UPDATE_PROHIBITED is intentionally not in this list. This is because it diff --git a/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java b/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java index 79ff68108..89fd18faf 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java @@ -43,9 +43,9 @@ import google.registry.config.RegistryConfig.Config; import google.registry.flows.EppException; import google.registry.flows.EppException.ParameterValuePolicyErrorException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; +import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.custom.DomainCheckFlowCustomLogic; import google.registry.flows.custom.DomainCheckFlowCustomLogic.BeforeResponseParameters; @@ -121,7 +121,7 @@ import org.joda.time.DateTime; * @error {@link OnlyCheckedNamesCanBeFeeCheckedException} */ @ReportingSpec(ActivityReportField.DOMAIN_CHECK) -public final class DomainCheckFlow implements Flow { +public final class DomainCheckFlow implements TransactionalFlow { @Inject ResourceCommand resourceCommand; @Inject ExtensionManager extensionManager; @@ -382,17 +382,13 @@ public final class DomainCheckFlow implements Flow { private ImmutableMap loadRecurrencesForDomains( ImmutableMap domainObjs) { - return tm().transact( - () -> { - ImmutableMap, BillingRecurrence> recurrences = - tm().loadByKeys( - domainObjs.values().stream() - .map(Domain::getAutorenewBillingEvent) - .collect(toImmutableSet())); - return ImmutableMap.copyOf( - Maps.transformValues( - domainObjs, d -> recurrences.get(d.getAutorenewBillingEvent()))); - }); + ImmutableMap, BillingRecurrence> recurrences = + tm().loadByKeys( + domainObjs.values().stream() + .map(Domain::getAutorenewBillingEvent) + .collect(toImmutableSet())); + return ImmutableMap.copyOf( + Maps.transformValues(domainObjs, d -> recurrences.get(d.getAutorenewBillingEvent()))); } /** diff --git a/core/src/main/java/google/registry/flows/domain/DomainClaimsCheckFlow.java b/core/src/main/java/google/registry/flows/domain/DomainClaimsCheckFlow.java index d707fcbae..8ffb60e88 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainClaimsCheckFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainClaimsCheckFlow.java @@ -23,7 +23,6 @@ import static google.registry.flows.domain.DomainFlowUtils.validateDomainNameWit import static google.registry.flows.domain.DomainFlowUtils.verifyClaimsPeriodNotEnded; import static google.registry.flows.domain.DomainFlowUtils.verifyNotInPredelegation; import static google.registry.model.domain.launch.LaunchPhase.CLAIMS; -import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -32,9 +31,9 @@ import google.registry.config.RegistryConfig.Config; import google.registry.flows.EppException; import google.registry.flows.EppException.CommandUseErrorException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; +import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.domain.DomainCommand.Check; import google.registry.model.domain.launch.LaunchCheckExtension; @@ -68,7 +67,7 @@ import org.joda.time.DateTime; * @error {@link DomainClaimsCheckNotAllowedWithAllocationTokens} */ @ReportingSpec(ActivityReportField.DOMAIN_CHECK) // Claims check is a special domain check. -public final class DomainClaimsCheckFlow implements Flow { +public final class DomainClaimsCheckFlow implements TransactionalFlow { @Inject ExtensionManager extensionManager; @Inject EppInput eppInput; @@ -109,8 +108,7 @@ public final class DomainClaimsCheckFlow implements Flow { verifyClaimsPeriodNotEnded(tld, now); } } - Optional claimKey = - tm().transact(() -> ClaimsListDao.get().getClaimKey(parsedDomain.parts().get(0))); + Optional claimKey = ClaimsListDao.get().getClaimKey(parsedDomain.parts().get(0)); launchChecksBuilder.add( LaunchCheck.create( LaunchCheckName.create(claimKey.isPresent(), domainName), claimKey.orElse(null))); diff --git a/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java b/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java index 2537f93a3..8002e9d3a 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java @@ -67,7 +67,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.custom.DomainCreateFlowCustomLogic; import google.registry.flows.custom.DomainCreateFlowCustomLogic.BeforeResponseParameters; @@ -210,7 +210,7 @@ import org.joda.time.Duration; * @error {@link DomainPricingLogic.AllocationTokenInvalidForPremiumNameException} */ @ReportingSpec(ActivityReportField.DOMAIN_CREATE) -public final class DomainCreateFlow implements TransactionalFlow { +public final class DomainCreateFlow implements MutatingFlow { /** Anchor tenant creates should always be for 2 years, since they get 2 years free. */ private static final int ANCHOR_TENANT_CREATE_VALID_YEARS = 2; diff --git a/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java b/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java index 93919c01f..13c17c6cc 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java @@ -51,8 +51,8 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; +import google.registry.flows.MutatingFlow; import google.registry.flows.SessionMetadata; -import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.custom.DomainDeleteFlowCustomLogic; import google.registry.flows.custom.DomainDeleteFlowCustomLogic.AfterValidationParameters; @@ -115,7 +115,7 @@ import org.joda.time.Duration; * @error {@link DomainFlowUtils.NotAuthorizedForTldException} */ @ReportingSpec(ActivityReportField.DOMAIN_DELETE) -public final class DomainDeleteFlow implements TransactionalFlow { +public final class DomainDeleteFlow implements MutatingFlow { private static final ImmutableSet DISALLOWED_STATUSES = ImmutableSet.of( StatusValue.CLIENT_DELETE_PROHIBITED, diff --git a/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java b/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java index 8c3d4f9dd..8b52185cf 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java @@ -28,10 +28,10 @@ import com.google.common.collect.ImmutableSet; import com.google.common.net.InternetDomainName; import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; +import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.custom.DomainInfoFlowCustomLogic; import google.registry.flows.custom.DomainInfoFlowCustomLogic.AfterValidationParameters; @@ -76,7 +76,7 @@ import org.joda.time.DateTime; * @error {@link DomainFlowUtils.TransfersAreAlwaysForOneYearException} */ @ReportingSpec(ActivityReportField.DOMAIN_INFO) -public final class DomainInfoFlow implements Flow { +public final class DomainInfoFlow implements TransactionalFlow { @Inject ExtensionManager extensionManager; @Inject ResourceCommand resourceCommand; @@ -120,14 +120,12 @@ public final class DomainInfoFlow implements Flow { .setLastEppUpdateTime(domain.getLastEppUpdateTime()) .setRegistrationExpirationTime(domain.getRegistrationExpirationTime()) .setLastTransferTime(domain.getLastTransferTime()) - .setRegistrant( - tm().transact(() -> tm().loadByKey(domain.getRegistrant())).getContactId()); + .setRegistrant(tm().loadByKey(domain.getRegistrant()).getContactId()); // If authInfo is non-null, then the caller is authorized to see the full information since we // will have already verified the authInfo is valid. if (registrarId.equals(domain.getCurrentSponsorRegistrarId()) || authInfo.isPresent()) { infoBuilder - .setContacts( - tm().transact(() -> loadForeignKeyedDesignatedContacts(domain.getContacts()))) + .setContacts(loadForeignKeyedDesignatedContacts(domain.getContacts())) .setSubordinateHosts( hostsRequest.requestSubordinate() ? domain.getSubordinateHosts() : null) .setCreationRegistrarId(domain.getCreationRegistrarId()) @@ -178,7 +176,7 @@ public final class DomainInfoFlow implements Flow { pricingLogic, Optional.empty(), false, - tm().transact(() -> tm().loadByKey(domain.getAutorenewBillingEvent()))); + tm().loadByKey(domain.getAutorenewBillingEvent())); extensions.add(builder.build()); } return extensions.build(); diff --git a/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java b/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java index 4d289c7ba..1ff5eeff2 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java @@ -44,7 +44,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.custom.DomainRenewFlowCustomLogic; import google.registry.flows.custom.DomainRenewFlowCustomLogic.AfterValidationParameters; @@ -137,7 +137,7 @@ import org.joda.time.Duration; * google.registry.flows.domain.token.AllocationTokenFlowUtils.AlreadyRedeemedAllocationTokenException} */ @ReportingSpec(ActivityReportField.DOMAIN_RENEW) -public final class DomainRenewFlow implements TransactionalFlow { +public final class DomainRenewFlow implements MutatingFlow { private static final ImmutableSet RENEW_DISALLOWED_STATUSES = ImmutableSet.of( StatusValue.CLIENT_RENEW_PROHIBITED, diff --git a/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java b/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java index af4b95aad..d19cb8b47 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java @@ -42,7 +42,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.ImmutableObject; import google.registry.model.billing.BillingBase.Reason; @@ -112,7 +112,7 @@ import org.joda.time.DateTime; * @error {@link DomainRestoreRequestFlow.RestoreCommandIncludesChangesException} */ @ReportingSpec(ActivityReportField.DOMAIN_RGP_RESTORE_REQUEST) -public final class DomainRestoreRequestFlow implements TransactionalFlow { +public final class DomainRestoreRequestFlow implements MutatingFlow { @Inject ResourceCommand resourceCommand; @Inject ExtensionManager extensionManager; diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java index 2d124d29f..dcf210ad6 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java @@ -41,7 +41,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.domain.token.AllocationTokenFlowUtils; import google.registry.model.ImmutableObject; @@ -106,7 +106,7 @@ import org.joda.time.DateTime; * google.registry.flows.domain.token.AllocationTokenFlowUtils.AlreadyRedeemedAllocationTokenException} */ @ReportingSpec(ActivityReportField.DOMAIN_TRANSFER_APPROVE) -public final class DomainTransferApproveFlow implements TransactionalFlow { +public final class DomainTransferApproveFlow implements MutatingFlow { @Inject ExtensionManager extensionManager; @Inject Optional authInfo; diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java index 3880cf656..9c8b4ba07 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java @@ -37,7 +37,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.billing.BillingRecurrence; import google.registry.model.domain.Domain; @@ -74,7 +74,7 @@ import org.joda.time.DateTime; * @error {@link DomainFlowUtils.NotAuthorizedForTldException} */ @ReportingSpec(ActivityReportField.DOMAIN_TRANSFER_CANCEL) -public final class DomainTransferCancelFlow implements TransactionalFlow { +public final class DomainTransferCancelFlow implements MutatingFlow { @Inject ExtensionManager extensionManager; @Inject Optional authInfo; diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferQueryFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferQueryFlow.java index db0d1add5..c2a21b469 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferQueryFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferQueryFlow.java @@ -21,10 +21,10 @@ import static google.registry.flows.domain.DomainTransferUtils.createTransferRes import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.TargetId; import google.registry.flows.ResourceFlowUtils; +import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.NoTransferHistoryToQueryException; import google.registry.flows.exceptions.NotAuthorizedToViewTransferException; @@ -56,7 +56,7 @@ import org.joda.time.DateTime; * @error {@link google.registry.flows.exceptions.NotAuthorizedToViewTransferException} */ @ReportingSpec(ActivityReportField.DOMAIN_TRANSFER_QUERY) -public final class DomainTransferQueryFlow implements Flow { +public final class DomainTransferQueryFlow implements TransactionalFlow { @Inject ExtensionManager extensionManager; @Inject Optional authInfo; diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java index 1eec1a04d..885840048 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java @@ -39,7 +39,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.billing.BillingRecurrence; import google.registry.model.domain.Domain; @@ -76,7 +76,7 @@ import org.joda.time.DateTime; * @error {@link DomainFlowUtils.NotAuthorizedForTldException} */ @ReportingSpec(ActivityReportField.DOMAIN_TRANSFER_REJECT) -public final class DomainTransferRejectFlow implements TransactionalFlow { +public final class DomainTransferRejectFlow implements MutatingFlow { @Inject ExtensionManager extensionManager; @Inject Optional authInfo; diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java index 1d12d64ec..cb87ef483 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java @@ -45,7 +45,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.domain.token.AllocationTokenFlowUtils; import google.registry.flows.exceptions.AlreadyPendingTransferException; @@ -135,7 +135,7 @@ import org.joda.time.DateTime; * google.registry.flows.domain.token.AllocationTokenFlowUtils.AlreadyRedeemedAllocationTokenException} */ @ReportingSpec(ActivityReportField.DOMAIN_TRANSFER_REQUEST) -public final class DomainTransferRequestFlow implements TransactionalFlow { +public final class DomainTransferRequestFlow implements MutatingFlow { private static final ImmutableSet DISALLOWED_STATUSES = ImmutableSet.of( StatusValue.CLIENT_TRANSFER_PROHIBITED, diff --git a/core/src/main/java/google/registry/flows/domain/DomainUpdateFlow.java b/core/src/main/java/google/registry/flows/domain/DomainUpdateFlow.java index 41223f27b..f12dda3e3 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainUpdateFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainUpdateFlow.java @@ -55,7 +55,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.custom.DomainUpdateFlowCustomLogic; import google.registry.flows.custom.DomainUpdateFlowCustomLogic.AfterValidationParameters; @@ -133,7 +133,7 @@ import org.joda.time.DateTime; * @error {@link DomainFlowUtils.UrgentAttributeNotSupportedException} */ @ReportingSpec(ActivityReportField.DOMAIN_UPDATE) -public final class DomainUpdateFlow implements TransactionalFlow { +public final class DomainUpdateFlow implements MutatingFlow { /** * A list of {@link StatusValue}s that prohibit updates. diff --git a/core/src/main/java/google/registry/flows/host/HostCheckFlow.java b/core/src/main/java/google/registry/flows/host/HostCheckFlow.java index 93dbc8bdc..636e15f20 100644 --- a/core/src/main/java/google/registry/flows/host/HostCheckFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostCheckFlow.java @@ -23,8 +23,8 @@ import com.google.common.collect.ImmutableSet; import google.registry.config.RegistryConfig.Config; import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; +import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.eppinput.ResourceCommand; import google.registry.model.eppoutput.CheckData.HostCheck; @@ -45,7 +45,7 @@ import javax.inject.Inject; * @error {@link google.registry.flows.FlowUtils.NotLoggedInException} */ @ReportingSpec(ActivityReportField.HOST_CHECK) -public final class HostCheckFlow implements Flow { +public final class HostCheckFlow implements TransactionalFlow { @Inject ResourceCommand resourceCommand; @Inject @RegistrarId String registrarId; diff --git a/core/src/main/java/google/registry/flows/host/HostCreateFlow.java b/core/src/main/java/google/registry/flows/host/HostCreateFlow.java index 34cad3a18..86694f138 100644 --- a/core/src/main/java/google/registry/flows/host/HostCreateFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostCreateFlow.java @@ -35,7 +35,7 @@ import google.registry.flows.EppException.RequiredParameterMissingException; import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ResourceAlreadyExistsForThisClientException; import google.registry.flows.exceptions.ResourceCreateContentionException; @@ -78,7 +78,7 @@ import org.joda.time.DateTime; * @error {@link UnexpectedExternalHostIpException} */ @ReportingSpec(ActivityReportField.HOST_CREATE) -public final class HostCreateFlow implements TransactionalFlow { +public final class HostCreateFlow implements MutatingFlow { @Inject ResourceCommand resourceCommand; @Inject ExtensionManager extensionManager; diff --git a/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java b/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java index d8e7db25e..71fa9c58b 100644 --- a/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java @@ -30,7 +30,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.EppResource; import google.registry.model.domain.metadata.MetadataExtension; @@ -63,7 +63,7 @@ import org.joda.time.DateTime; * @error {@link HostFlowUtils.HostNameNotPunyCodedException} */ @ReportingSpec(ActivityReportField.HOST_DELETE) -public final class HostDeleteFlow implements TransactionalFlow { +public final class HostDeleteFlow implements MutatingFlow { private static final ImmutableSet DISALLOWED_STATUSES = ImmutableSet.of( diff --git a/core/src/main/java/google/registry/flows/host/HostInfoFlow.java b/core/src/main/java/google/registry/flows/host/HostInfoFlow.java index dd343a065..532dfbf9a 100644 --- a/core/src/main/java/google/registry/flows/host/HostInfoFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostInfoFlow.java @@ -23,9 +23,9 @@ import static google.registry.persistence.transaction.TransactionManagerFactory. import com.google.common.collect.ImmutableSet; import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.TargetId; +import google.registry.flows.TransactionalFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.model.domain.Domain; import google.registry.model.eppcommon.StatusValue; @@ -50,7 +50,7 @@ import org.joda.time.DateTime; * @error {@link HostFlowUtils.HostNameNotPunyCodedException} */ @ReportingSpec(ActivityReportField.HOST_INFO) -public final class HostInfoFlow implements Flow { +public final class HostInfoFlow implements TransactionalFlow { @Inject ExtensionManager extensionManager; @Inject @RegistrarId String registrarId; @@ -77,8 +77,7 @@ public final class HostInfoFlow implements Flow { // there is no superordinate domain, the host's own values for these fields will be correct. if (host.isSubordinate()) { Domain superordinateDomain = - tm().transact( - () -> tm().loadByKey(host.getSuperordinateDomain()).cloneProjectedAtTime(now)); + tm().loadByKey(host.getSuperordinateDomain()).cloneProjectedAtTime(now); hostInfoDataBuilder .setCurrentSponsorRegistrarId(superordinateDomain.getCurrentSponsorRegistrarId()) .setLastTransferTime(host.computeLastTransferTime(superordinateDomain)); diff --git a/core/src/main/java/google/registry/flows/host/HostUpdateFlow.java b/core/src/main/java/google/registry/flows/host/HostUpdateFlow.java index fdaeb78e0..647f44d35 100644 --- a/core/src/main/java/google/registry/flows/host/HostUpdateFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostUpdateFlow.java @@ -47,7 +47,7 @@ import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; import google.registry.flows.FlowModule.Superuser; import google.registry.flows.FlowModule.TargetId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.flows.annotations.ReportingSpec; import google.registry.flows.exceptions.ResourceHasClientUpdateProhibitedException; import google.registry.model.EppResource; @@ -107,7 +107,7 @@ import org.joda.time.DateTime; * @error {@link RenameHostToExternalRemoveIpException} */ @ReportingSpec(ActivityReportField.HOST_UPDATE) -public final class HostUpdateFlow implements TransactionalFlow { +public final class HostUpdateFlow implements MutatingFlow { /** * Note that CLIENT_UPDATE_PROHIBITED is intentionally not in this list. This is because it diff --git a/core/src/main/java/google/registry/flows/poll/PollAckFlow.java b/core/src/main/java/google/registry/flows/poll/PollAckFlow.java index 7d16c5cb8..51d09e897 100644 --- a/core/src/main/java/google/registry/flows/poll/PollAckFlow.java +++ b/core/src/main/java/google/registry/flows/poll/PollAckFlow.java @@ -31,7 +31,7 @@ import google.registry.flows.EppException.RequiredParameterMissingException; import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.PollMessageId; import google.registry.flows.FlowModule.RegistrarId; -import google.registry.flows.TransactionalFlow; +import google.registry.flows.MutatingFlow; import google.registry.model.eppoutput.EppResponse; import google.registry.model.poll.MessageQueueInfo; import google.registry.model.poll.PollMessage; @@ -55,7 +55,7 @@ import org.joda.time.DateTime; * @error {@link PollAckFlow.MissingMessageIdException} * @error {@link PollAckFlow.NotAuthorizedToAckMessageException} */ -public final class PollAckFlow implements TransactionalFlow { +public final class PollAckFlow implements MutatingFlow { @Inject ExtensionManager extensionManager; @Inject @RegistrarId String registrarId; diff --git a/core/src/main/java/google/registry/flows/poll/PollRequestFlow.java b/core/src/main/java/google/registry/flows/poll/PollRequestFlow.java index 55f331d5c..c07db4b7a 100644 --- a/core/src/main/java/google/registry/flows/poll/PollRequestFlow.java +++ b/core/src/main/java/google/registry/flows/poll/PollRequestFlow.java @@ -25,9 +25,9 @@ import static google.registry.persistence.transaction.TransactionManagerFactory. import google.registry.flows.EppException; import google.registry.flows.EppException.ParameterValueSyntaxErrorException; import google.registry.flows.ExtensionManager; -import google.registry.flows.Flow; import google.registry.flows.FlowModule.PollMessageId; import google.registry.flows.FlowModule.RegistrarId; +import google.registry.flows.TransactionalFlow; import google.registry.model.eppoutput.EppResponse; import google.registry.model.poll.MessageQueueInfo; import google.registry.model.poll.PollMessage; @@ -47,7 +47,7 @@ import org.joda.time.DateTime; * * @error {@link PollRequestFlow.UnexpectedMessageIdException} */ -public final class PollRequestFlow implements Flow { +public final class PollRequestFlow implements TransactionalFlow { @Inject ExtensionManager extensionManager; @Inject @RegistrarId String registrarId; @@ -64,26 +64,23 @@ public final class PollRequestFlow implements Flow { } // Return the oldest message from the queue. - return tm().transact( - () -> { - DateTime now = tm().getTransactionTime(); - Optional maybePollMessage = getFirstPollMessage(registrarId, now); - if (!maybePollMessage.isPresent()) { - return responseBuilder.setResultFromCode(SUCCESS_WITH_NO_MESSAGES).build(); - } - PollMessage pollMessage = maybePollMessage.get(); - return responseBuilder - .setResultFromCode(SUCCESS_WITH_ACK_MESSAGE) - .setMessageQueueInfo( - new MessageQueueInfo.Builder() - .setQueueDate(pollMessage.getEventTime()) - .setMsg(pollMessage.getMsg()) - .setQueueLength(getPollMessageCount(registrarId, now)) - .setMessageId(makePollMessageExternalId(pollMessage)) - .build()) - .setMultipleResData(pollMessage.getResponseData()) - .build(); - }); + DateTime now = tm().getTransactionTime(); + Optional maybePollMessage = getFirstPollMessage(registrarId, now); + if (!maybePollMessage.isPresent()) { + return responseBuilder.setResultFromCode(SUCCESS_WITH_NO_MESSAGES).build(); + } + PollMessage pollMessage = maybePollMessage.get(); + return responseBuilder + .setResultFromCode(SUCCESS_WITH_ACK_MESSAGE) + .setMessageQueueInfo( + new MessageQueueInfo.Builder() + .setQueueDate(pollMessage.getEventTime()) + .setMsg(pollMessage.getMsg()) + .setQueueLength(getPollMessageCount(registrarId, now)) + .setMessageId(makePollMessageExternalId(pollMessage)) + .build()) + .setMultipleResData(pollMessage.getResponseData()) + .build(); } /** Unexpected message id. */ diff --git a/core/src/main/java/google/registry/flows/session/LoginFlow.java b/core/src/main/java/google/registry/flows/session/LoginFlow.java index 3f5216af5..ce76917d3 100644 --- a/core/src/main/java/google/registry/flows/session/LoginFlow.java +++ b/core/src/main/java/google/registry/flows/session/LoginFlow.java @@ -30,8 +30,8 @@ import google.registry.flows.EppException.UnimplementedExtensionException; import google.registry.flows.EppException.UnimplementedObjectServiceException; import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.RegistrarId; +import google.registry.flows.MutatingFlow; import google.registry.flows.SessionMetadata; -import google.registry.flows.TransactionalFlow; import google.registry.flows.TransportCredentials; import google.registry.model.eppcommon.ProtocolDefinition; import google.registry.model.eppcommon.ProtocolDefinition.ServiceExtension; @@ -62,7 +62,7 @@ import javax.inject.Inject; * @error {@link LoginFlow.RegistrarAccountNotActiveException} * @error {@link LoginFlow.UnsupportedLanguageException} */ -public class LoginFlow implements TransactionalFlow { +public class LoginFlow implements MutatingFlow { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); diff --git a/core/src/main/java/google/registry/model/EppResource.java b/core/src/main/java/google/registry/model/EppResource.java index cb7a56497..b534fab44 100644 --- a/core/src/main/java/google/registry/model/EppResource.java +++ b/core/src/main/java/google/registry/model/EppResource.java @@ -20,7 +20,6 @@ import static com.google.common.collect.Sets.difference; import static com.google.common.collect.Sets.union; import static google.registry.config.RegistryConfig.getEppResourceCachingDuration; import static google.registry.config.RegistryConfig.getEppResourceMaxCachedEntries; -import static google.registry.persistence.transaction.TransactionManagerFactory.replicaTm; import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.util.CollectionUtils.nullToEmpty; import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy; @@ -358,13 +357,13 @@ public abstract class EppResource extends UpdateAutoTimestampEntity implements B @Override public EppResource load(VKey key) { - return replicaTm().transact(() -> replicaTm().loadByKey(key)); + return tm().reTransact(() -> tm().loadByKey(key)); } @Override public Map, EppResource> loadAll( Iterable> keys) { - return replicaTm().transact(() -> replicaTm().loadByKeys(keys)); + return tm().reTransact(() -> tm().loadByKeys(keys)); } }; @@ -403,7 +402,7 @@ public abstract class EppResource extends UpdateAutoTimestampEntity implements B public static ImmutableMap, EppResource> loadCached( Iterable> keys) { if (!RegistryConfig.isEppResourceCachingEnabled()) { - return tm().transact(() -> tm().loadByKeys(keys)); + return tm().reTransact(() -> tm().loadByKeys(keys)); } return ImmutableMap.copyOf(cacheEppResources.getAll(keys)); } @@ -416,7 +415,7 @@ public abstract class EppResource extends UpdateAutoTimestampEntity implements B */ public static T loadCached(VKey key) { if (!RegistryConfig.isEppResourceCachingEnabled()) { - return tm().transact(() -> tm().loadByKey(key)); + return tm().reTransact(() -> tm().loadByKey(key)); } // Safe to cast because loading a Key returns an entity of type T. @SuppressWarnings("unchecked") diff --git a/core/src/main/java/google/registry/model/ForeignKeyUtils.java b/core/src/main/java/google/registry/model/ForeignKeyUtils.java index 1231ffd44..696a26ba7 100644 --- a/core/src/main/java/google/registry/model/ForeignKeyUtils.java +++ b/core/src/main/java/google/registry/model/ForeignKeyUtils.java @@ -109,7 +109,7 @@ public final class ForeignKeyUtils { Class clazz, Collection foreignKeys, boolean useReplicaTm) { String fkProperty = RESOURCE_TYPE_TO_FK_PROPERTY.get(clazz); JpaTransactionManager tmToUse = useReplicaTm ? replicaTm() : tm(); - return tmToUse.transact( + return tmToUse.reTransact( () -> tmToUse .query( diff --git a/core/src/test/java/google/registry/flows/FlowTestCase.java b/core/src/test/java/google/registry/flows/FlowTestCase.java index e123cbe89..9611bd9ac 100644 --- a/core/src/test/java/google/registry/flows/FlowTestCase.java +++ b/core/src/test/java/google/registry/flows/FlowTestCase.java @@ -145,14 +145,14 @@ public abstract class FlowTestCase { sessionMetadata.setRegistrarId(registrarId); } - public void assertTransactionalFlow(boolean isTransactional) throws Exception { + public void assertMutatingFlow(boolean isMutating) throws Exception { Class flowClass = FlowPicker.getFlowClass(eppLoader.getEpp()); - if (isTransactional) { - assertThat(flowClass).isAssignableTo(TransactionalFlow.class); + if (isMutating) { + assertThat(flowClass).isAssignableTo(MutatingFlow.class); } else { // There's no "isNotAssignableTo" in Truth. - assertWithMessage(flowClass.getSimpleName() + " implements TransactionalFlow") - .that(TransactionalFlow.class.isAssignableFrom(flowClass)) + assertWithMessage(flowClass.getSimpleName() + " implements MutatingFlow") + .that(MutatingFlow.class.isAssignableFrom(flowClass)) .isFalse(); } } diff --git a/core/src/test/java/google/registry/flows/ResourceCheckFlowTestCase.java b/core/src/test/java/google/registry/flows/ResourceCheckFlowTestCase.java index afc96ca56..d29e41465 100644 --- a/core/src/test/java/google/registry/flows/ResourceCheckFlowTestCase.java +++ b/core/src/test/java/google/registry/flows/ResourceCheckFlowTestCase.java @@ -30,7 +30,7 @@ public abstract class ResourceCheckFlowTestCase { protected void doCheckTest(CheckData.Check... expected) throws Exception { - assertTransactionalFlow(false); + assertMutatingFlow(false); assertThat(((CheckData) runFlow().getResponse().getResponseData().get(0)).getChecks()) .containsExactlyElementsIn(expected); assertNoHistory(); // Checks don't create a history event. diff --git a/core/src/test/java/google/registry/flows/contact/ContactCreateFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactCreateFlowTest.java index 52c3ffd7a..bc758d63f 100644 --- a/core/src/test/java/google/registry/flows/contact/ContactCreateFlowTest.java +++ b/core/src/test/java/google/registry/flows/contact/ContactCreateFlowTest.java @@ -44,7 +44,7 @@ class ContactCreateFlowTest extends ResourceFlowTestCase void testSuccess() throws Exception { persistContact(true); // Check that the persisted contact info was returned. - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse( loadFile("contact_info_response.xml"), // We use a different roid scheme than the samples so ignore it. @@ -123,7 +123,7 @@ class ContactInfoFlowTest extends ResourceFlowTestCase createTld("foobar"); persistResource(DatabaseHelper.newDomain("example.foobar", persistContact(true))); // Check that the persisted contact info was returned. - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse( loadFile("contact_info_response_linked.xml"), // We use a different roid scheme than the samples so ignore it. @@ -137,7 +137,7 @@ class ContactInfoFlowTest extends ResourceFlowTestCase setEppInput("contact_info_no_authinfo.xml"); persistContact(true); // Check that the persisted contact info was returned. - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse( loadFile("contact_info_response.xml"), // We use a different roid scheme than the samples so ignore it. @@ -151,7 +151,7 @@ class ContactInfoFlowTest extends ResourceFlowTestCase setRegistrarIdForFlow("NewRegistrar"); persistContact(true); // Check that the persisted contact info was returned. - assertTransactionalFlow(false); + assertMutatingFlow(false); ResourceNotOwnedException thrown = assertThrows(ResourceNotOwnedException.class, this::runFlow); assertAboutEppExceptions().that(thrown).marshalsToXml(); } @@ -162,7 +162,7 @@ class ContactInfoFlowTest extends ResourceFlowTestCase setEppInput("contact_info_no_authinfo.xml"); persistContact(true); // Check that the persisted contact info was returned. - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse( CommitMode.LIVE, UserPrivileges.SUPERUSER, @@ -178,7 +178,7 @@ class ContactInfoFlowTest extends ResourceFlowTestCase setRegistrarIdForFlow("NewRegistrar"); persistContact(true); // Check that the persisted contact info was returned. - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse( CommitMode.LIVE, UserPrivileges.SUPERUSER, diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferApproveFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferApproveFlowTest.java index 59b0b849d..ed2bb584a 100644 --- a/core/src/test/java/google/registry/flows/contact/ContactTransferApproveFlowTest.java +++ b/core/src/test/java/google/registry/flows/contact/ContactTransferApproveFlowTest.java @@ -69,7 +69,7 @@ class ContactTransferApproveFlowTest // Setup done; run the test. contact = reloadResourceByForeignKey(); TransferData originalTransferData = contact.getTransferData(); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile(expectedXmlFilename)); // Transfer should have succeeded. Verify correct fields were set. @@ -120,7 +120,7 @@ class ContactTransferApproveFlowTest private void doFailingTest(String commandFilename) throws Exception { setEppInput(commandFilename); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlow(); } diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferCancelFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferCancelFlowTest.java index 0d5c62f00..34cc6feab 100644 --- a/core/src/test/java/google/registry/flows/contact/ContactTransferCancelFlowTest.java +++ b/core/src/test/java/google/registry/flows/contact/ContactTransferCancelFlowTest.java @@ -63,7 +63,7 @@ class ContactTransferCancelFlowTest // Setup done; run the test. contact = reloadResourceByForeignKey(); TransferData originalTransferData = contact.getTransferData(); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile(expectedXmlFilename)); // Transfer should have been cancelled. Verify correct fields were set. @@ -104,7 +104,7 @@ class ContactTransferCancelFlowTest private void doFailingTest(String commandFilename) throws Exception { this.setEppInput(commandFilename); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlow(); } diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferQueryFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferQueryFlowTest.java index 367ddff19..cd0990f30 100644 --- a/core/src/test/java/google/registry/flows/contact/ContactTransferQueryFlowTest.java +++ b/core/src/test/java/google/registry/flows/contact/ContactTransferQueryFlowTest.java @@ -53,7 +53,7 @@ class ContactTransferQueryFlowTest setEppInput(commandFilename); eppLoader.replaceAll("JD1234-REP", contact.getRepoId()); // Setup done; run the test. - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile(expectedXmlFilename)); assertAboutContacts().that(reloadResourceByForeignKey(clock.nowUtc().minusDays(1))) .hasOneHistoryEntryEachOfTypes(HistoryEntry.Type.CONTACT_TRANSFER_REQUEST); @@ -64,7 +64,7 @@ class ContactTransferQueryFlowTest setEppInput(commandFilename); eppLoader.replaceAll("JD1234-REP", contact.getRepoId()); // Setup done; run the test. - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlow(); } diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferRejectFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferRejectFlowTest.java index 8742ff109..cadb75cd2 100644 --- a/core/src/test/java/google/registry/flows/contact/ContactTransferRejectFlowTest.java +++ b/core/src/test/java/google/registry/flows/contact/ContactTransferRejectFlowTest.java @@ -67,7 +67,7 @@ class ContactTransferRejectFlowTest // Setup done; run the test. contact = reloadResourceByForeignKey(); TransferData originalTransferData = contact.getTransferData(); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile(expectedXmlFilename)); // Transfer should have failed. Verify correct fields were set. @@ -119,7 +119,7 @@ class ContactTransferRejectFlowTest private void doFailingTest(String commandFilename) throws Exception { setEppInput(commandFilename); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlow(); } diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferRequestFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferRequestFlowTest.java index c6671ef03..de9ebf8ef 100644 --- a/core/src/test/java/google/registry/flows/contact/ContactTransferRequestFlowTest.java +++ b/core/src/test/java/google/registry/flows/contact/ContactTransferRequestFlowTest.java @@ -78,7 +78,7 @@ class ContactTransferRequestFlowTest DateTime afterTransfer = clock.nowUtc().plus(getContactAutomaticTransferLength()); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile(expectedXmlFilename)); // Transfer should have been requested. Verify correct fields were set. @@ -140,7 +140,7 @@ class ContactTransferRequestFlowTest private void doFailingTest(String commandFilename) throws Exception { setEppInput(commandFilename); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlow(); } diff --git a/core/src/test/java/google/registry/flows/contact/ContactUpdateFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactUpdateFlowTest.java index c61d00d1a..268130c24 100644 --- a/core/src/test/java/google/registry/flows/contact/ContactUpdateFlowTest.java +++ b/core/src/test/java/google/registry/flows/contact/ContactUpdateFlowTest.java @@ -53,7 +53,7 @@ class ContactUpdateFlowTest extends ResourceFlowTestCase substitutions) throws Exception { - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse( CommitMode.LIVE, userPrivileges, loadFile(responseXmlFile, substitutions)); assertSuccessfulCreate(domainTld, ImmutableSet.of()); @@ -613,7 +613,7 @@ class DomainCreateFlowTest extends ResourceFlowTestCase { ImmutableMap substitutions, boolean expectHistoryAndBilling) throws Exception { - assertTransactionalFlow(false); + assertMutatingFlow(false); String expected = loadFile(expectedXmlFilename, updateSubstitutions(substitutions, "ROID", "2FF-TLD")); if (inactive) { diff --git a/core/src/test/java/google/registry/flows/domain/DomainRenewFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainRenewFlowTest.java index 5b375a844..33902c7a6 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainRenewFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainRenewFlowTest.java @@ -250,7 +250,7 @@ class DomainRenewFlowTest extends ResourceFlowTestCase RenewalPriceBehavior renewalPriceBehavior, @Nullable Money renewalPrice) throws Exception { - assertTransactionalFlow(true); + assertMutatingFlow(true); DateTime currentExpiration = reloadResourceByForeignKey().getRegistrationExpirationTime(); DateTime newExpiration = currentExpiration.plusYears(renewalYears); runFlowAssertResponse( diff --git a/core/src/test/java/google/registry/flows/domain/DomainRestoreRequestFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainRestoreRequestFlowTest.java index c73f1d12e..f62beb1e4 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainRestoreRequestFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainRestoreRequestFlowTest.java @@ -163,7 +163,7 @@ class DomainRestoreRequestFlowTest extends ResourceFlowTestCase originalGracePeriods = domain.getGracePeriods(); DomainTransferData originalTransferData = domain.getTransferData(); @@ -190,7 +190,7 @@ class DomainTransferCancelFlowTest // Replace the ROID in the xml file with the one generated in our test. eppLoader.replaceAll("JD1234-REP", contact.getRepoId()); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlow(); } diff --git a/core/src/test/java/google/registry/flows/domain/DomainTransferQueryFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainTransferQueryFlowTest.java index d215d9c13..7297dcdb3 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainTransferQueryFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainTransferQueryFlowTest.java @@ -55,7 +55,7 @@ class DomainTransferQueryFlowTest // Replace the ROID in the xml file with the one generated in our test. eppLoader.replaceAll("JD1234-REP", contact.getRepoId()); // Setup done; run the test. - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile(expectedXmlFilename)); assertAboutDomains() .that(domain) @@ -76,7 +76,7 @@ class DomainTransferQueryFlowTest // Replace the ROID in the xml file with the one generated in our test. eppLoader.replaceAll("JD1234-REP", contact.getRepoId()); // Setup done; run the test. - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlow(); } diff --git a/core/src/test/java/google/registry/flows/domain/DomainTransferRejectFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainTransferRejectFlowTest.java index 568d6e553..8179c2811 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainTransferRejectFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainTransferRejectFlowTest.java @@ -89,7 +89,7 @@ class DomainTransferRejectFlowTest assertThat(getPollMessages("NewRegistrar", clock.nowUtc().plusMonths(1))).hasSize(1); assertThat(getPollMessages("TheRegistrar", clock.nowUtc().plusMonths(1))).hasSize(1); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); DateTime originalExpirationTime = domain.getRegistrationExpirationTime(); ImmutableSet originalGracePeriods = domain.getGracePeriods(); TransferData originalTransferData = domain.getTransferData(); @@ -152,7 +152,7 @@ class DomainTransferRejectFlowTest // Replace the ROID in the xml file with the one generated in our test. eppLoader.replaceAll("JD1234-REP", contact.getRepoId()); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlow(); } diff --git a/core/src/test/java/google/registry/flows/domain/DomainTransferRequestFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainTransferRequestFlowTest.java index c6af3beb9..8b3d435ea 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainTransferRequestFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainTransferRequestFlowTest.java @@ -483,7 +483,7 @@ class DomainTransferRequestFlowTest Tld registry = Tld.get(domain.getTld()); DateTime implicitTransferTime = clock.nowUtc().plus(registry.getAutomaticTransferLength()); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile(expectedXmlFilename, substitutions)); // Transfer should have been requested. domain = reloadResourceByForeignKey(); @@ -583,7 +583,7 @@ class DomainTransferRequestFlowTest // the transfer timeline 3 days later by adjusting the implicit transfer time here. DateTime implicitTransferTime = clock.nowUtc().plus(expectedAutomaticTransferLength); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse( CommitMode.LIVE, UserPrivileges.SUPERUSER, loadFile(expectedXmlFilename, substitutions)); @@ -634,7 +634,7 @@ class DomainTransferRequestFlowTest // Replace the ROID in the xml file with the one generated in our test. eppLoader.replaceAll("JD1234-REP", contact.getRepoId()); // Setup done; run the test. - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlow(CommitMode.LIVE, userPrivileges); } @@ -1741,7 +1741,7 @@ class DomainTransferRequestFlowTest "domain_transfer_request_wildcard.xml", ImmutableMap.of("YEARS", "1", "DOMAIN", "--invalid", "EXDATE", "2002-09-08T22:00:00.0Z")); eppLoader.replaceAll("JD1234-REP", contact.getRepoId()); - assertTransactionalFlow(true); + assertMutatingFlow(true); ResourceDoesNotExistException thrown = assertThrows( ResourceDoesNotExistException.class, diff --git a/core/src/test/java/google/registry/flows/domain/DomainUpdateFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainUpdateFlowTest.java index 2e3b9a1cf..8583682fd 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainUpdateFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainUpdateFlowTest.java @@ -203,7 +203,7 @@ class DomainUpdateFlowTest extends ResourceFlowTestCase { private void doSuccessfulTest() throws Exception { clock.advanceOneMilli(); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile("host_create_response.xml")); Host host = reloadResourceByForeignKey(); // Check that the host was created and persisted with a history entry. diff --git a/core/src/test/java/google/registry/flows/host/HostDeleteFlowTest.java b/core/src/test/java/google/registry/flows/host/HostDeleteFlowTest.java index 958717d6d..cc4f8f221 100644 --- a/core/src/test/java/google/registry/flows/host/HostDeleteFlowTest.java +++ b/core/src/test/java/google/registry/flows/host/HostDeleteFlowTest.java @@ -77,7 +77,7 @@ class HostDeleteFlowTest extends ResourceFlowTestCase { void testSuccess() throws Exception { persistActiveHost("ns1.example.tld"); clock.advanceOneMilli(); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile("host_delete_response.xml")); assertSqlDeleteSuccess(); } @@ -87,7 +87,7 @@ class HostDeleteFlowTest extends ResourceFlowTestCase { setEppInput("host_delete_no_cltrid.xml", ImmutableMap.of("HOSTNAME", "ns1.example.tld")); persistActiveHost("ns1.example.tld"); clock.advanceOneMilli(); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile("host_delete_response_no_cltrid.xml")); assertSqlDeleteSuccess(); } diff --git a/core/src/test/java/google/registry/flows/host/HostInfoFlowTest.java b/core/src/test/java/google/registry/flows/host/HostInfoFlowTest.java index b36edf9b1..be4aecae3 100644 --- a/core/src/test/java/google/registry/flows/host/HostInfoFlowTest.java +++ b/core/src/test/java/google/registry/flows/host/HostInfoFlowTest.java @@ -82,7 +82,7 @@ class HostInfoFlowTest extends ResourceFlowTestCase { @Test void testSuccess() throws Exception { persistHost(); - assertTransactionalFlow(false); + assertMutatingFlow(false); // Check that the persisted host info was returned. runFlowAssertResponse( loadFile("host_info_response.xml"), @@ -100,7 +100,7 @@ class HostInfoFlowTest extends ResourceFlowTestCase { .asBuilder() .addNameserver(persistHost().createVKey()) .build()); - assertTransactionalFlow(false); + assertMutatingFlow(false); // Check that the persisted host info was returned. runFlowAssertResponse( loadFile("host_info_response_linked.xml"), @@ -131,7 +131,7 @@ class HostInfoFlowTest extends ResourceFlowTestCase { .build()); // we shouldn't have two active hosts with the same hostname deleteResource(firstHost); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse( loadFile("host_info_response_superordinate_clientid.xml"), // We use a different roid scheme than the samples so ignore it. diff --git a/core/src/test/java/google/registry/flows/host/HostUpdateFlowTest.java b/core/src/test/java/google/registry/flows/host/HostUpdateFlowTest.java index c6e2e6bdc..6a6bd34ec 100644 --- a/core/src/test/java/google/registry/flows/host/HostUpdateFlowTest.java +++ b/core/src/test/java/google/registry/flows/host/HostUpdateFlowTest.java @@ -160,7 +160,7 @@ class HostUpdateFlowTest extends ResourceFlowTestCase { private Host doSuccessfulTest(boolean isSuperuser) throws Exception { clock.advanceOneMilli(); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse( CommitMode.LIVE, isSuperuser ? UserPrivileges.SUPERUSER : UserPrivileges.NORMAL, diff --git a/core/src/test/java/google/registry/flows/poll/PollAckFlowTest.java b/core/src/test/java/google/registry/flows/poll/PollAckFlowTest.java index a0b762d37..b221dabb8 100644 --- a/core/src/test/java/google/registry/flows/poll/PollAckFlowTest.java +++ b/core/src/test/java/google/registry/flows/poll/PollAckFlowTest.java @@ -96,7 +96,7 @@ class PollAckFlowTest extends FlowTestCase { .setMsg("Some poll message.") .setHistoryEntry(createHistoryEntryForEppResource(contact)) .build()); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile("poll_ack_response_empty.xml")); } @@ -111,14 +111,14 @@ class PollAckFlowTest extends FlowTestCase { .setMsg("Some poll message.") .setHistoryEntry(createHistoryEntryForEppResource(contact)) .build()); - assertTransactionalFlow(true); + assertMutatingFlow(true); assertThrows(MessageDoesNotExistException.class, this::runFlow); } @Test void testSuccess_messageOnContact() throws Exception { persistOneTimePollMessage(MESSAGE_ID); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile("poll_ack_response_empty.xml")); } @@ -126,7 +126,7 @@ class PollAckFlowTest extends FlowTestCase { void testSuccess_recentActiveAutorenew() throws Exception { setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "3-2010")); persistAutorenewPollMessage(clock.nowUtc().minusMonths(6), END_OF_TIME); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile("poll_ack_response_empty.xml")); } @@ -139,7 +139,7 @@ class PollAckFlowTest extends FlowTestCase { for (int i = 1; i < 4; i++) { persistOneTimePollMessage(MESSAGE_ID + i); } - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse( loadFile("poll_ack_response.xml", ImmutableMap.of("MSGID", "3-2009", "COUNT", "4"))); } @@ -148,7 +148,7 @@ class PollAckFlowTest extends FlowTestCase { void testSuccess_oldInactiveAutorenew() throws Exception { setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "3-2010")); persistAutorenewPollMessage(clock.nowUtc().minusMonths(6), clock.nowUtc()); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile("poll_ack_response_empty.xml")); } @@ -158,14 +158,14 @@ class PollAckFlowTest extends FlowTestCase { for (int i = 0; i < 5; i++) { persistOneTimePollMessage(MESSAGE_ID + i); } - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse( loadFile("poll_ack_response.xml", ImmutableMap.of("MSGID", "3-2011", "COUNT", "4"))); } @Test void testFailure_noSuchMessage() throws Exception { - assertTransactionalFlow(true); + assertMutatingFlow(true); Exception e = assertThrows(MessageDoesNotExistException.class, this::runFlow); assertThat(e).hasMessageThat().contains(String.format("(%d-2011)", MESSAGE_ID)); } @@ -173,14 +173,14 @@ class PollAckFlowTest extends FlowTestCase { @Test void testFailure_invalidId_tooFewComponents() throws Exception { setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "1")); - assertTransactionalFlow(true); + assertMutatingFlow(true); assertThrows(InvalidMessageIdException.class, this::runFlow); } @Test void testFailure_invalidId_tooManyComponents() throws Exception { setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "2-2-1999-2007")); - assertTransactionalFlow(true); + assertMutatingFlow(true); assertThrows(InvalidMessageIdException.class, this::runFlow); } @@ -195,21 +195,21 @@ class PollAckFlowTest extends FlowTestCase { .setMsg("Some poll message.") .setHistoryEntry(createHistoryEntryForEppResource(contact)) .build()); - assertTransactionalFlow(true); + assertMutatingFlow(true); assertThrows(InvalidMessageIdException.class, this::runFlow); } @Test void testFailure_invalidId_stringInsteadOfNumeric() throws Exception { setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "ABC-12345")); - assertTransactionalFlow(true); + assertMutatingFlow(true); assertThrows(InvalidMessageIdException.class, this::runFlow); } @Test void testFailure_missingId() throws Exception { setEppInput("poll_ack_missing_id.xml"); - assertTransactionalFlow(true); + assertMutatingFlow(true); assertThrows(MissingMessageIdException.class, this::runFlow); } @@ -223,7 +223,7 @@ class PollAckFlowTest extends FlowTestCase { .setMsg("Some poll message.") .setHistoryEntry(createHistoryEntryForEppResource(domain)) .build()); - assertTransactionalFlow(true); + assertMutatingFlow(true); assertThrows(NotAuthorizedToAckMessageException.class, this::runFlow); } @@ -237,7 +237,7 @@ class PollAckFlowTest extends FlowTestCase { .setMsg("Some poll message.") .setHistoryEntry(createHistoryEntryForEppResource(domain)) .build()); - assertTransactionalFlow(true); + assertMutatingFlow(true); Exception e = assertThrows(MessageDoesNotExistException.class, this::runFlow); assertThat(e).hasMessageThat().contains(String.format("(%d-2011)", MESSAGE_ID)); } diff --git a/core/src/test/java/google/registry/flows/poll/PollRequestFlowTest.java b/core/src/test/java/google/registry/flows/poll/PollRequestFlowTest.java index 990f7ba01..94ce93735 100644 --- a/core/src/test/java/google/registry/flows/poll/PollRequestFlowTest.java +++ b/core/src/test/java/google/registry/flows/poll/PollRequestFlowTest.java @@ -87,7 +87,7 @@ class PollRequestFlowTest extends FlowTestCase { @Test void testSuccess_domainTransferApproved() throws Exception { persistPendingTransferPollMessage(); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile("poll_response_domain_transfer.xml")); } @@ -95,7 +95,7 @@ class PollRequestFlowTest extends FlowTestCase { void testSuccess_clTridNotSpecified() throws Exception { setEppInput("poll_no_cltrid.xml"); persistPendingTransferPollMessage(); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile("poll_response_domain_transfer_no_cltrid.xml")); } @@ -120,7 +120,7 @@ class PollRequestFlowTest extends FlowTestCase { .build())) .setHistoryEntry(createHistoryEntryForEppResource(contact)) .build()); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile("poll_response_contact_transfer.xml")); } @@ -140,7 +140,7 @@ class PollRequestFlowTest extends FlowTestCase { clock.nowUtc()))) .setHistoryEntry(createHistoryEntryForEppResource(domain)) .build()); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile("poll_response_domain_pending_notification.xml")); } @@ -164,7 +164,7 @@ class PollRequestFlowTest extends FlowTestCase { clock.nowUtc()))) .setHistoryEntry(createHistoryEntryForEppResource(domain)) .build()); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile("poll_message_domain_pending_action_immediate_delete.xml")); } @@ -178,7 +178,7 @@ class PollRequestFlowTest extends FlowTestCase { .setTargetId("test.example") .setHistoryEntry(createHistoryEntryForEppResource(domain)) .build()); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile("poll_response_autorenew.xml")); } @@ -221,7 +221,7 @@ class PollRequestFlowTest extends FlowTestCase { .setTargetId("target.example") .setHistoryEntry(createHistoryEntryForEppResource(domain)) .build()); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile("poll_response_empty.xml")); } @@ -244,7 +244,7 @@ class PollRequestFlowTest extends FlowTestCase { .setHistoryEntry(historyEntry) .setEventTime(clock.nowUtc().minusDays(1)) .build()); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile("poll_response_contact_delete.xml")); } @@ -268,14 +268,14 @@ class PollRequestFlowTest extends FlowTestCase { .setEventTime(clock.nowUtc().minusDays(1)) .build()); clock.advanceOneMilli(); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse(loadFile("poll_response_host_delete.xml")); } @Test void testFailure_messageIdProvided() throws Exception { setEppInput("poll_with_id.xml"); - assertTransactionalFlow(false); + assertMutatingFlow(false); EppException thrown = assertThrows(UnexpectedMessageIdException.class, this::runFlow); assertAboutEppExceptions().that(thrown).marshalsToXml(); } diff --git a/core/src/test/java/google/registry/flows/session/HelloFlowTest.java b/core/src/test/java/google/registry/flows/session/HelloFlowTest.java index bfb5f82a0..ca2eab1fc 100644 --- a/core/src/test/java/google/registry/flows/session/HelloFlowTest.java +++ b/core/src/test/java/google/registry/flows/session/HelloFlowTest.java @@ -30,7 +30,7 @@ class HelloFlowTest extends FlowTestCase { @Test void testHello() throws Exception { setEppInput("hello.xml"); - assertTransactionalFlow(false); + assertMutatingFlow(false); runFlowAssertResponse( loadFile( "greeting.xml", ImmutableMap.of("DATE", clock.nowUtc().toString(dateTimeNoMillis())))); diff --git a/core/src/test/java/google/registry/flows/session/LoginFlowTestCase.java b/core/src/test/java/google/registry/flows/session/LoginFlowTestCase.java index 2d787eb34..fbb338bcc 100644 --- a/core/src/test/java/google/registry/flows/session/LoginFlowTestCase.java +++ b/core/src/test/java/google/registry/flows/session/LoginFlowTestCase.java @@ -62,7 +62,7 @@ public abstract class LoginFlowTestCase extends FlowTestCase { // Also called in subclasses. void doSuccessfulTest(String xmlFilename) throws Exception { setEppInput(xmlFilename); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile("generic_success_response.xml")); } @@ -81,7 +81,7 @@ public abstract class LoginFlowTestCase extends FlowTestCase { @Test void testSuccess_setsIsLoginResponse() throws Exception { setEppInput("login_valid.xml"); - assertTransactionalFlow(true); + assertMutatingFlow(true); EppOutput output = runFlow(); assertThat(output.getResponse().isLoginResponse()).isTrue(); } @@ -125,7 +125,7 @@ public abstract class LoginFlowTestCase extends FlowTestCase { assertThat(registrar.verifyPassword("randomstring")).isFalse(); setEppInput("login_set_new_password.xml", ImmutableMap.of("NEWPW", "ANewPassword")); - assertTransactionalFlow(true); + assertMutatingFlow(true); runFlowAssertResponse(loadFile("generic_success_response.xml")); Registrar newRegistrar = loadRegistrar("NewRegistrar"); diff --git a/core/src/test/java/google/registry/flows/session/LogoutFlowTest.java b/core/src/test/java/google/registry/flows/session/LogoutFlowTest.java index 1ab2e18ba..62e74e100 100644 --- a/core/src/test/java/google/registry/flows/session/LogoutFlowTest.java +++ b/core/src/test/java/google/registry/flows/session/LogoutFlowTest.java @@ -38,7 +38,7 @@ class LogoutFlowTest extends FlowTestCase { @Test void testSuccess() throws Exception { - assertTransactionalFlow(false); + assertMutatingFlow(false); // All flow tests are implicitly logged in, so logout should work. runFlowAssertResponse(loadFile("logout_response.xml")); }