Simplify the use of the fee extension a little

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=133149148
This commit is contained in:
cgoldfeder 2016-09-14 11:16:35 -07:00 committed by Ben McIlwain
parent 1ee02108ae
commit 01e2e0141d
11 changed files with 57 additions and 92 deletions

View file

@ -23,7 +23,6 @@ import static google.registry.model.index.DomainApplicationIndex.loadActiveAppli
import static google.registry.model.registry.label.ReservationType.UNRESERVED; import static google.registry.model.registry.label.ReservationType.UNRESERVED;
import static google.registry.pricing.PricingEngineProxy.getPricesForDomainName; import static google.registry.pricing.PricingEngineProxy.getPricesForDomainName;
import static google.registry.util.CollectionUtils.nullToEmpty; import static google.registry.util.CollectionUtils.nullToEmpty;
import static google.registry.util.DomainNameUtils.getTldFromDomainName;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable; import com.google.common.collect.FluentIterable;
@ -49,7 +48,6 @@ import google.registry.model.registry.label.ReservationType;
import java.util.Collections; import java.util.Collections;
import java.util.Set; import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import org.joda.money.CurrencyUnit;
/** /**
* An EPP flow that checks whether a domain can be provisioned. * An EPP flow that checks whether a domain can be provisioned.
@ -148,7 +146,7 @@ public class DomainCheckFlow extends BaseDomainCheckFlow {
// If this version of the fee extension is nameless, use the full list of domains. // If this version of the fee extension is nameless, use the full list of domains.
return domainNames.keySet(); return domainNames.keySet();
} }
} }
/** Handle the fee check extension. */ /** Handle the fee check extension. */
@Override @Override
@ -160,7 +158,6 @@ public class DomainCheckFlow extends BaseDomainCheckFlow {
if (feeCheck == null) { if (feeCheck == null) {
return null; // No fee checks were requested. return null; // No fee checks were requested.
} }
CurrencyUnit topLevelCurrency = feeCheck.isCurrencySupported() ? feeCheck.getCurrency() : null;
ImmutableList.Builder<FeeCheckResponseExtensionItem> feeCheckResponseItemsBuilder = ImmutableList.Builder<FeeCheckResponseExtensionItem> feeCheckResponseItemsBuilder =
new ImmutableList.Builder<>(); new ImmutableList.Builder<>();
for (FeeCheckCommandExtensionItem feeCheckItem : feeCheck.getItems()) { for (FeeCheckCommandExtensionItem feeCheckItem : feeCheck.getItems()) {
@ -169,10 +166,9 @@ public class DomainCheckFlow extends BaseDomainCheckFlow {
handleFeeRequest( handleFeeRequest(
feeCheckItem, feeCheckItem,
builder, builder,
domainName, domainNames.get(domainName),
getTldFromDomainName(domainName),
getClientId(), getClientId(),
topLevelCurrency, feeCheck.getCurrency(),
now, now,
eppInput); eppInput);
feeCheckResponseItemsBuilder feeCheckResponseItemsBuilder
@ -182,7 +178,7 @@ public class DomainCheckFlow extends BaseDomainCheckFlow {
return ImmutableList.<ResponseExtension>of( return ImmutableList.<ResponseExtension>of(
feeCheck.createResponse(feeCheckResponseItemsBuilder.build())); feeCheck.createResponse(feeCheckResponseItemsBuilder.build()));
} }
/** By server policy, fee check names must be listed in the availability check. */ /** By server policy, fee check names must be listed in the availability check. */
static class OnlyCheckedNamesCanBeFeeCheckedException extends ParameterValuePolicyErrorException { static class OnlyCheckedNamesCanBeFeeCheckedException extends ParameterValuePolicyErrorException {
OnlyCheckedNamesCanBeFeeCheckedException() { OnlyCheckedNamesCanBeFeeCheckedException() {

View file

@ -564,14 +564,13 @@ public class DomainFlowUtils {
static void handleFeeRequest( static void handleFeeRequest(
FeeQueryCommandExtensionItem feeRequest, FeeQueryCommandExtensionItem feeRequest,
FeeQueryResponseExtensionItem.Builder builder, FeeQueryResponseExtensionItem.Builder builder,
String domainName, InternetDomainName domain,
String tld,
String clientIdentifier, String clientIdentifier,
@Nullable CurrencyUnit topLevelCurrency, @Nullable CurrencyUnit topLevelCurrency,
DateTime now, DateTime now,
EppInput eppInput) throws EppException { EppInput eppInput) throws EppException {
InternetDomainName domain = InternetDomainName.from(domainName); String domainNameString = domain.toString();
Registry registry = Registry.get(tld); Registry registry = Registry.get(domain.parent().toString());
int years = verifyUnitIsYears(feeRequest.getPeriod()).getValue(); int years = verifyUnitIsYears(feeRequest.getPeriod()).getValue();
boolean isSunrise = registry.getTldState(now).equals(TldState.SUNRISE); boolean isSunrise = registry.getTldState(now).equals(TldState.SUNRISE);
@ -580,7 +579,7 @@ public class DomainFlowUtils {
} }
CurrencyUnit currency = CurrencyUnit currency =
feeRequest.isCurrencySupported() ? feeRequest.getCurrency() : topLevelCurrency; feeRequest.getCurrency() != null ? feeRequest.getCurrency() : topLevelCurrency;
if ((currency != null) && !currency.equals(registry.getCurrency())) { if ((currency != null) && !currency.equals(registry.getCurrency())) {
throw new CurrencyUnitMismatchException(); throw new CurrencyUnitMismatchException();
} }
@ -589,7 +588,7 @@ public class DomainFlowUtils {
.setCommand(feeRequest.getCommandName(), feeRequest.getPhase(), feeRequest.getSubphase()) .setCommand(feeRequest.getCommandName(), feeRequest.getPhase(), feeRequest.getSubphase())
.setCurrencyIfSupported(registry.getCurrency()) .setCurrencyIfSupported(registry.getCurrency())
.setPeriod(feeRequest.getPeriod()) .setPeriod(feeRequest.getPeriod())
.setClass(TldSpecificLogicProxy.getFeeClass(domainName, now).orNull()); .setClass(TldSpecificLogicProxy.getFeeClass(domainNameString, now).orNull());
switch (feeRequest.getCommandName()) { switch (feeRequest.getCommandName()) {
case CREATE: case CREATE:
@ -600,13 +599,13 @@ public class DomainFlowUtils {
} else { } else {
builder.setAvailIfSupported(true); builder.setAvailIfSupported(true);
builder.setFees(TldSpecificLogicProxy.getCreatePrice( builder.setFees(TldSpecificLogicProxy.getCreatePrice(
registry, domainName, clientIdentifier, now, years, eppInput).getFees()); registry, domainNameString, clientIdentifier, now, years, eppInput).getFees());
} }
break; break;
case RENEW: case RENEW:
builder.setAvailIfSupported(true); builder.setAvailIfSupported(true);
builder.setFees(TldSpecificLogicProxy.getRenewPrice( builder.setFees(TldSpecificLogicProxy.getRenewPrice(
registry, domainName, clientIdentifier, now, years, eppInput).getFees()); registry, domainNameString, clientIdentifier, now, years, eppInput).getFees());
break; break;
case RESTORE: case RESTORE:
if (years != 1) { if (years != 1) {
@ -614,17 +613,17 @@ public class DomainFlowUtils {
} }
builder.setAvailIfSupported(true); builder.setAvailIfSupported(true);
builder.setFees(TldSpecificLogicProxy.getRestorePrice( builder.setFees(TldSpecificLogicProxy.getRestorePrice(
registry, domainName, clientIdentifier, now, eppInput).getFees()); registry, domainNameString, clientIdentifier, now, eppInput).getFees());
break; break;
case TRANSFER: case TRANSFER:
builder.setAvailIfSupported(true); builder.setAvailIfSupported(true);
builder.setFees(TldSpecificLogicProxy.getTransferPrice( builder.setFees(TldSpecificLogicProxy.getTransferPrice(
registry, domainName, clientIdentifier, now, years, eppInput).getFees()); registry, domainNameString, clientIdentifier, now, years, eppInput).getFees());
break; break;
case UPDATE: case UPDATE:
builder.setAvailIfSupported(true); builder.setAvailIfSupported(true);
builder.setFees(TldSpecificLogicProxy.getUpdatePrice( builder.setFees(TldSpecificLogicProxy.getUpdatePrice(
registry, domainName, clientIdentifier, now, eppInput).getFees()); registry, domainNameString, clientIdentifier, now, eppInput).getFees());
break; break;
default: default:
throw new UnknownFeeCommandException(feeRequest.getUnparsedCommandName()); throw new UnknownFeeCommandException(feeRequest.getUnparsedCommandName());

View file

@ -19,6 +19,7 @@ import static google.registry.flows.domain.DomainFlowUtils.handleFeeRequest;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.net.InternetDomainName;
import google.registry.flows.EppException; import google.registry.flows.EppException;
import google.registry.model.domain.DomainResource; import google.registry.model.domain.DomainResource;
import google.registry.model.domain.DomainResource.Builder; import google.registry.model.domain.DomainResource.Builder;
@ -97,8 +98,7 @@ public class DomainInfoFlow extends BaseDomainInfoFlow<DomainResource, Builder>
handleFeeRequest( handleFeeRequest(
feeInfo, feeInfo,
builder, builder,
getTargetId(), InternetDomainName.from(getTargetId()),
existingResource.getTld(),
getClientId(), getClientId(),
null, null,
now, now,

View file

@ -24,7 +24,7 @@ import org.joda.money.CurrencyUnit;
* of items requesting the fees for particular commands and domains. For some versions of the fee * of items requesting the fees for particular commands and domains. For some versions of the fee
* extension, the currency is also specified here; for other versions it is contained in the * extension, the currency is also specified here; for other versions it is contained in the
* individual items. * individual items.
* *
* @type C the type of extension item used by this command (e.g. v6 items for a v6 extension) * @type C the type of extension item used by this command (e.g. v6 items for a v6 extension)
* @type R the type of response returned for for this command (e.g. v6 responses for a v6 extension) * @type R the type of response returned for for this command (e.g. v6 responses for a v6 extension)
*/ */
@ -33,13 +33,14 @@ public interface FeeCheckCommandExtension<
R extends FeeCheckResponseExtension<?>> R extends FeeCheckResponseExtension<?>>
extends CommandExtension { extends CommandExtension {
/** True if this version of the fee extension specifies the currency at the top level. */ /**
public boolean isCurrencySupported(); * Three-character ISO4217 currency code.
*
* <p>Returns null if this version of the fee extension doesn't specify currency at the top level.
*/
public CurrencyUnit getCurrency();
/** Three-character currency code; throws an exception if currency is not supported. */
public CurrencyUnit getCurrency() throws UnsupportedOperationException;
public ImmutableSet<C> getItems(); public ImmutableSet<C> getItems();
public R createResponse(ImmutableList<? extends FeeCheckResponseExtensionItem> items); public R createResponse(ImmutableList<? extends FeeCheckResponseExtensionItem> items);
} }

View file

@ -35,18 +35,19 @@ public interface FeeQueryCommandExtensionItem {
UPDATE UPDATE
} }
/** True if this version of fee extension includes a currency in this type of query item. */ /**
public boolean isCurrencySupported(); * Three-character ISO4217 currency code.
*
/** A three-character ISO4217 currency code; throws an exception if currency is not supported. */ * <p>Returns null if this version of the fee extension doesn't specify currency at the top level.
public CurrencyUnit getCurrency() throws UnsupportedOperationException; */
public CurrencyUnit getCurrency();
/** The name of the command being checked. */ /** The name of the command being checked. */
public CommandName getCommandName(); public CommandName getCommandName();
/** The unparse name of the command being checked, for use in error strings. */ /** The unparse name of the command being checked, for use in error strings. */
public String getUnparsedCommandName(); public String getUnparsedCommandName();
/** The phase of the command being checked. */ /** The phase of the command being checked. */
public String getPhase(); public String getPhase();

View file

@ -29,7 +29,7 @@ public class FeeCheckCommandExtensionItemV06
String name; String name;
CurrencyUnit currency; CurrencyUnit currency;
@Override @Override
public boolean isDomainNameSupported() { public boolean isDomainNameSupported() {
return true; return true;
@ -40,11 +40,6 @@ public class FeeCheckCommandExtensionItemV06
return name; return name;
} }
@Override
public boolean isCurrencySupported() {
return true;
}
@Override @Override
public CurrencyUnit getCurrency() { public CurrencyUnit getCurrency() {
return currency; return currency;

View file

@ -32,18 +32,13 @@ public class FeeCheckCommandExtensionV06 extends ImmutableObject
implements FeeCheckCommandExtension< implements FeeCheckCommandExtension<
FeeCheckCommandExtensionItemV06, FeeCheckCommandExtensionItemV06,
FeeCheckResponseExtensionV06> { FeeCheckResponseExtensionV06> {
@XmlElement(name = "domain") @XmlElement(name = "domain")
Set<FeeCheckCommandExtensionItemV06> items; Set<FeeCheckCommandExtensionItemV06> items;
@Override
public boolean isCurrencySupported() {
return false;
}
@Override @Override
public CurrencyUnit getCurrency() { public CurrencyUnit getCurrency() {
throw new UnsupportedOperationException("Currency not supported"); return null; // This version of the fee extension doesn't specify a top-level currency.
} }
@Override @Override

View file

@ -25,15 +25,10 @@ import org.joda.money.CurrencyUnit;
@XmlType(propOrder = {"currency", "command", "period"}) @XmlType(propOrder = {"currency", "command", "period"})
public class FeeInfoCommandExtensionV06 public class FeeInfoCommandExtensionV06
extends FeeQueryCommandExtensionItemImpl implements CommandExtension { extends FeeQueryCommandExtensionItemImpl implements CommandExtension {
/** A three-character ISO4217 currency code. */ /** A three-character ISO4217 currency code. */
CurrencyUnit currency; CurrencyUnit currency;
@Override
public boolean isCurrencySupported() {
return true;
}
@Override @Override
public CurrencyUnit getCurrency() { public CurrencyUnit getCurrency() {
return currency; return currency;

View file

@ -52,22 +52,20 @@ public class FeeCheckCommandExtensionV11 extends ImmutableObject
/** Three-letter currency code in which results should be returned. */ /** Three-letter currency code in which results should be returned. */
CurrencyUnit currency; CurrencyUnit currency;
/** The period to check. */ /** The period to check. */
Period period; Period period;
/** The class to check. */ /** The class to check. */
@XmlElement(name = "class") @XmlElement(name = "class")
String feeClass; String feeClass;
@Override
public boolean isCurrencySupported() {
return false;
}
@Override @Override
public CurrencyUnit getCurrency() { public CurrencyUnit getCurrency() {
throw new UnsupportedOperationException("Currency not supported"); // This version of the fee extension does not have any items, and although the currency is
// specified at the top level we've modeled it as a single fake item with the currency inside,
// so there's no top level currency to return here.
return null;
} }
@Override @Override
@ -96,13 +94,13 @@ public class FeeCheckCommandExtensionV11 extends ImmutableObject
public CommandName getCommandName() { public CommandName getCommandName() {
return command.getCommand(); return command.getCommand();
} }
/** The command name before being parsed into an enum, for use in error strings. */ /** The command name before being parsed into an enum, for use in error strings. */
@Override @Override
public String getUnparsedCommandName() { public String getUnparsedCommandName() {
return command.getUnparsedCommandName(); return command.getUnparsedCommandName();
} }
/** The phase of the command being checked. */ /** The phase of the command being checked. */
@Override @Override
public String getPhase() { public String getPhase() {
@ -119,22 +117,17 @@ public class FeeCheckCommandExtensionV11 extends ImmutableObject
public Period getPeriod() { public Period getPeriod() {
return Optional.fromNullable(period).or(DEFAULT_PERIOD); return Optional.fromNullable(period).or(DEFAULT_PERIOD);
} }
@Override @Override
public boolean isDomainNameSupported() { public boolean isDomainNameSupported() {
return false; return false;
} }
@Override @Override
public String getDomainName() { public String getDomainName() {
throw new UnsupportedOperationException("Domain not supported"); throw new UnsupportedOperationException("Domain not supported");
} }
@Override
public boolean isCurrencySupported() {
return true;
}
@Override @Override
public CurrencyUnit getCurrency() { public CurrencyUnit getCurrency() {
return currency; return currency;

View file

@ -30,13 +30,13 @@ import org.joda.time.DateTime;
/** /**
* An individual price check item in version 0.12 of the fee extension on domain check commands. * An individual price check item in version 0.12 of the fee extension on domain check commands.
* Items look like: * Items look like:
* *
* <fee:command name="renew" phase="sunrise" subphase="hello"> * <fee:command name="renew" phase="sunrise" subphase="hello">
* <fee:period unit="y">1</fee:period> * <fee:period unit="y">1</fee:period>
* <fee:class>premium</fee:class> * <fee:class>premium</fee:class>
* <fee:date>2017-05-17T13:22:21.0Z</fee:date> * <fee:date>2017-05-17T13:22:21.0Z</fee:date>
* </fee:command> * </fee:command>
* *
* In a change from previous versions of the extension, items do not contain domain names; instead, * In a change from previous versions of the extension, items do not contain domain names; instead,
* the names from the non-extension check element are used. * the names from the non-extension check element are used.
*/ */
@ -49,7 +49,7 @@ public class FeeCheckCommandExtensionItemV12
@XmlAttribute(name = "name") @XmlAttribute(name = "name")
String commandName; String commandName;
@XmlAttribute @XmlAttribute
String phase; String phase;
@ -58,10 +58,10 @@ public class FeeCheckCommandExtensionItemV12
@XmlElement @XmlElement
Period period; Period period;
@XmlElement(name = "class") @XmlElement(name = "class")
String feeClass; String feeClass;
@XmlElement(name = "date") @XmlElement(name = "date")
DateTime feeDate; DateTime feeDate;
@ -75,22 +75,17 @@ public class FeeCheckCommandExtensionItemV12
public String getDomainName() { public String getDomainName() {
throw new UnsupportedOperationException("Domain not supported"); throw new UnsupportedOperationException("Domain not supported");
} }
@Override
public boolean isCurrencySupported() {
return false;
}
@Override @Override
public CurrencyUnit getCurrency() { public CurrencyUnit getCurrency() {
throw new UnsupportedOperationException("Currency not supported"); return null; // This version of the fee extension doesn't specify currency per-item.
} }
@Override @Override
public String getUnparsedCommandName() { public String getUnparsedCommandName() {
return commandName; return commandName;
} }
@Override @Override
public CommandName getCommandName() { public CommandName getCommandName() {
// Require the xml string to be lowercase. // Require the xml string to be lowercase.
@ -108,7 +103,7 @@ public class FeeCheckCommandExtensionItemV12
public String getPhase() { public String getPhase() {
return phase; return phase;
} }
@Override @Override
public String getSubphase() { public String getSubphase() {
return subphase; return subphase;

View file

@ -36,17 +36,12 @@ public class FeeCheckCommandExtensionV12 extends ImmutableObject
FeeCheckResponseExtensionV12> { FeeCheckResponseExtensionV12> {
CurrencyUnit currency; CurrencyUnit currency;
@Override
public boolean isCurrencySupported() {
return true;
}
@Override @Override
public CurrencyUnit getCurrency() { public CurrencyUnit getCurrency() {
return currency; return currency;
} }
@XmlElement(name = "command") @XmlElement(name = "command")
Set<FeeCheckCommandExtensionItemV12> items; Set<FeeCheckCommandExtensionItemV12> items;