From 743ff99ca30b116aefde63e7aa769ca8ace53820 Mon Sep 17 00:00:00 2001 From: jianglai Date: Fri, 16 Sep 2016 13:24:36 -0700 Subject: [PATCH] Support custom effective date for fee check command Added support to specify custom effective date to run the fee check command. Such functionality is useful for TLDs with creation price as a function of time, such as those with EAP. However the implementation is not limited EAP or create price check. Any fee check can specify a date, as long as its XML schema supports a date. Currently conforming to fee extension v12, subject to schema changes. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=133420255 --- .../flows/domain/DomainCheckFlow.java | 4 +- .../registry/flows/domain/DomainInfoFlow.java | 2 +- .../fee/FeeQueryCommandExtensionItem.java | 5 ++ .../FeeCheckCommandExtensionItemV06.java | 7 +++ .../fee06/FeeInfoCommandExtensionV06.java | 7 +++ .../fee11/FeeCheckCommandExtensionV11.java | 6 ++ .../FeeCheckCommandExtensionItemV12.java | 5 ++ .../model/domain/fee12/package-info.java | 6 +- .../flows/domain/DomainCheckFlowTest.java | 10 ++- ...domain_check_eap_fee_response_date_v12.xml | 61 +++++++++++++++++++ .../testdata/domain_check_fee_date_v12.xml | 25 ++++++++ .../domain/testdata/domain_check_fee_v12.xml | 1 - 12 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 javatests/google/registry/flows/domain/testdata/domain_check_eap_fee_response_date_v12.xml create mode 100644 javatests/google/registry/flows/domain/testdata/domain_check_fee_date_v12.xml diff --git a/java/google/registry/flows/domain/DomainCheckFlow.java b/java/google/registry/flows/domain/DomainCheckFlow.java index 46fab25af..6f18d4f72 100644 --- a/java/google/registry/flows/domain/DomainCheckFlow.java +++ b/java/google/registry/flows/domain/DomainCheckFlow.java @@ -169,7 +169,9 @@ public class DomainCheckFlow extends BaseDomainCheckFlow { domainNames.get(domainName), getClientId(), feeCheck.getCurrency(), - now, + feeCheckItem.getEffectiveDate().isPresent() + ? feeCheckItem.getEffectiveDate().get() + : now, eppInput); feeCheckResponseItemsBuilder .add(builder.setDomainNameIfSupported(domainName).build()); diff --git a/java/google/registry/flows/domain/DomainInfoFlow.java b/java/google/registry/flows/domain/DomainInfoFlow.java index c9043e0d1..82b131744 100644 --- a/java/google/registry/flows/domain/DomainInfoFlow.java +++ b/java/google/registry/flows/domain/DomainInfoFlow.java @@ -101,7 +101,7 @@ public class DomainInfoFlow extends BaseDomainInfoFlow InternetDomainName.from(getTargetId()), getClientId(), null, - now, + feeInfo.getEffectiveDate().isPresent() ? feeInfo.getEffectiveDate().get() : now, eppInput); extensions.add(builder.build()); } diff --git a/java/google/registry/model/domain/fee/FeeQueryCommandExtensionItem.java b/java/google/registry/model/domain/fee/FeeQueryCommandExtensionItem.java index fc0e2cc6b..58fbc19f9 100644 --- a/java/google/registry/model/domain/fee/FeeQueryCommandExtensionItem.java +++ b/java/google/registry/model/domain/fee/FeeQueryCommandExtensionItem.java @@ -14,8 +14,10 @@ package google.registry.model.domain.fee; +import com.google.common.base.Optional; import google.registry.model.domain.Period; import org.joda.money.CurrencyUnit; +import org.joda.time.DateTime; /** * Interface for individual query items in Check and Info commands. Each item indicates the command @@ -42,6 +44,9 @@ public interface FeeQueryCommandExtensionItem { */ public CurrencyUnit getCurrency(); + /** The as-of date for the fee extension to run. */ + public Optional getEffectiveDate(); + /** The name of the command being checked. */ public CommandName getCommandName(); diff --git a/java/google/registry/model/domain/fee06/FeeCheckCommandExtensionItemV06.java b/java/google/registry/model/domain/fee06/FeeCheckCommandExtensionItemV06.java index 7b1c977d1..420665ca0 100644 --- a/java/google/registry/model/domain/fee06/FeeCheckCommandExtensionItemV06.java +++ b/java/google/registry/model/domain/fee06/FeeCheckCommandExtensionItemV06.java @@ -14,11 +14,13 @@ package google.registry.model.domain.fee06; +import com.google.common.base.Optional; import google.registry.model.domain.fee.FeeCheckCommandExtensionItem; import google.registry.model.domain.fee.FeeCheckResponseExtensionItem; import google.registry.model.domain.fee.FeeQueryCommandExtensionItemImpl; import javax.xml.bind.annotation.XmlType; import org.joda.money.CurrencyUnit; +import org.joda.time.DateTime; /** An individual price check item in version 0.6 of the fee extension on Check commands. */ @XmlType(propOrder = {"name", "currency", "command", "period"}) @@ -49,4 +51,9 @@ public class FeeCheckCommandExtensionItemV06 public FeeCheckResponseExtensionItem.Builder createResponseBuilder() { return new FeeCheckResponseExtensionItemV06.Builder(); } + + @Override + public Optional getEffectiveDate() { + return Optional.absent(); + } } diff --git a/java/google/registry/model/domain/fee06/FeeInfoCommandExtensionV06.java b/java/google/registry/model/domain/fee06/FeeInfoCommandExtensionV06.java index 6ce0a4dda..93778a8e6 100644 --- a/java/google/registry/model/domain/fee06/FeeInfoCommandExtensionV06.java +++ b/java/google/registry/model/domain/fee06/FeeInfoCommandExtensionV06.java @@ -14,11 +14,13 @@ package google.registry.model.domain.fee06; +import com.google.common.base.Optional; import google.registry.model.domain.fee.FeeQueryCommandExtensionItemImpl; import google.registry.model.eppinput.EppInput.CommandExtension; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import org.joda.money.CurrencyUnit; +import org.joda.time.DateTime; /** A fee extension that may be present on domain info commands. */ @XmlRootElement(name = "info") @@ -33,5 +35,10 @@ public class FeeInfoCommandExtensionV06 public CurrencyUnit getCurrency() { return currency; } + + @Override + public Optional getEffectiveDate() { + return Optional.absent(); + } } diff --git a/java/google/registry/model/domain/fee11/FeeCheckCommandExtensionV11.java b/java/google/registry/model/domain/fee11/FeeCheckCommandExtensionV11.java index ceb8791f8..e5a5803aa 100644 --- a/java/google/registry/model/domain/fee11/FeeCheckCommandExtensionV11.java +++ b/java/google/registry/model/domain/fee11/FeeCheckCommandExtensionV11.java @@ -31,6 +31,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import org.joda.money.CurrencyUnit; +import org.joda.time.DateTime; /** * Version 0.11 of the fee extension that may be present on domain check commands. Unlike other @@ -137,5 +138,10 @@ public class FeeCheckCommandExtensionV11 extends ImmutableObject public Builder createResponseBuilder() { return new FeeCheckResponseExtensionItemV11.Builder(); } + + @Override + public Optional getEffectiveDate() { + return Optional.absent(); + } } } diff --git a/java/google/registry/model/domain/fee12/FeeCheckCommandExtensionItemV12.java b/java/google/registry/model/domain/fee12/FeeCheckCommandExtensionItemV12.java index 329667d17..ef6ae471e 100644 --- a/java/google/registry/model/domain/fee12/FeeCheckCommandExtensionItemV12.java +++ b/java/google/registry/model/domain/fee12/FeeCheckCommandExtensionItemV12.java @@ -118,4 +118,9 @@ public class FeeCheckCommandExtensionItemV12 public FeeCheckResponseExtensionItem.Builder createResponseBuilder() { return new FeeCheckResponseExtensionItemV12.Builder(); } + + @Override + public Optional getEffectiveDate() { + return Optional.fromNullable(feeDate); + } } diff --git a/java/google/registry/model/domain/fee12/package-info.java b/java/google/registry/model/domain/fee12/package-info.java index 73a24dd91..6a2184deb 100644 --- a/java/google/registry/model/domain/fee12/package-info.java +++ b/java/google/registry/model/domain/fee12/package-info.java @@ -17,13 +17,17 @@ xmlns = @XmlNs(prefix = "fee12", namespaceURI = "urn:ietf:params:xml:ns:fee-0.12"), elementFormDefault = XmlNsForm.QUALIFIED) @XmlAccessorType(XmlAccessType.FIELD) -@XmlJavaTypeAdapter(CurrencyUnitAdapter.class) +@XmlJavaTypeAdapters({ + @XmlJavaTypeAdapter(CurrencyUnitAdapter.class), + @XmlJavaTypeAdapter(UtcDateTimeAdapter.class)}) package google.registry.model.domain.fee12; import google.registry.model.translators.CurrencyUnitAdapter; +import google.registry.xml.UtcDateTimeAdapter; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters; diff --git a/javatests/google/registry/flows/domain/DomainCheckFlowTest.java b/javatests/google/registry/flows/domain/DomainCheckFlowTest.java index fe2d89492..f46012ef9 100644 --- a/javatests/google/registry/flows/domain/DomainCheckFlowTest.java +++ b/javatests/google/registry/flows/domain/DomainCheckFlowTest.java @@ -776,7 +776,8 @@ public class DomainCheckFlowTest .setEapFeeSchedule(ImmutableSortedMap.of( START_OF_TIME, Money.of(USD, 0), clock.nowUtc().minusDays(1), Money.of(USD, 100), - clock.nowUtc().plusDays(1), Money.of(USD, 0))) + clock.nowUtc().plusDays(1), Money.of(USD, 50), + clock.nowUtc().plusDays(2), Money.of(USD, 0))) .build()); setEppInput(inputFile); runFlowAssertResponse(readFile(outputFile)); @@ -796,4 +797,11 @@ public class DomainCheckFlowTest public void testSuccess_eapFeeCheck_v12() throws Exception { runEapFeeCheckTest("domain_check_fee_v12.xml", "domain_check_eap_fee_response_v12.xml"); } + + @Test + public void testSuccess_eapFeeCheck_date_v12() throws Exception { + runEapFeeCheckTest("domain_check_fee_date_v12.xml", + "domain_check_eap_fee_response_date_v12.xml"); + } + } diff --git a/javatests/google/registry/flows/domain/testdata/domain_check_eap_fee_response_date_v12.xml b/javatests/google/registry/flows/domain/testdata/domain_check_eap_fee_response_date_v12.xml new file mode 100644 index 000000000..f41e225c4 --- /dev/null +++ b/javatests/google/registry/flows/domain/testdata/domain_check_eap_fee_response_date_v12.xml @@ -0,0 +1,61 @@ + + + + Command completed successfully + + + + + example1.tld + In use + + + example2.tld + + + example3.tld + + + + + + USD + + + example1.tld + + + 1 + 13.00 + 50.00 + + + + + example2.tld + + + 1 + 13.00 + 50.00 + + + + + example3.tld + + + 1 + 13.00 + 50.00 + + + + + + ABC-12345 + server-trid + + + diff --git a/javatests/google/registry/flows/domain/testdata/domain_check_fee_date_v12.xml b/javatests/google/registry/flows/domain/testdata/domain_check_fee_date_v12.xml new file mode 100644 index 000000000..4c56dc3ca --- /dev/null +++ b/javatests/google/registry/flows/domain/testdata/domain_check_fee_date_v12.xml @@ -0,0 +1,25 @@ + + + + + example1.tld + example2.tld + example3.tld + + + + + custom + + + USD + + 1 + premium + 2010-01-02T13:22:21Z + + + + ABC-12345 + + diff --git a/javatests/google/registry/flows/domain/testdata/domain_check_fee_v12.xml b/javatests/google/registry/flows/domain/testdata/domain_check_fee_v12.xml index b452d4191..bdff84a95 100644 --- a/javatests/google/registry/flows/domain/testdata/domain_check_fee_v12.xml +++ b/javatests/google/registry/flows/domain/testdata/domain_check_fee_v12.xml @@ -16,7 +16,6 @@ 1 premium - 2017-05-17T13:22:21.0Z