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")); }