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