Rename PricingEngine to PremiumPricingEngine

This properly reflects the fact that other, separate things will now
be responsible both for EAP and for per-TLD custom pricing.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124558165
This commit is contained in:
Ben McIlwain 2016-06-10 07:10:59 -07:00 committed by Justine Tunney
parent 366c5a344d
commit 6ba1d5e6df
11 changed files with 45 additions and 52 deletions

View file

@ -79,7 +79,7 @@ import google.registry.model.mark.Mark;
import google.registry.model.mark.ProtectedMark; import google.registry.model.mark.ProtectedMark;
import google.registry.model.mark.Trademark; import google.registry.model.mark.Trademark;
import google.registry.model.poll.PollMessage; import google.registry.model.poll.PollMessage;
import google.registry.model.pricing.PricingEngine.DomainPrices; import google.registry.model.pricing.PremiumPricingEngine.DomainPrices;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.registry.Registry.TldState; import google.registry.model.registry.Registry.TldState;

View file

@ -19,8 +19,13 @@ import com.google.common.base.Optional;
import org.joda.money.Money; import org.joda.money.Money;
import org.joda.time.DateTime; import org.joda.time.DateTime;
/** A plugin interface for premium pricing engines. */ /**
public interface PricingEngine { * A plugin interface for premium pricing engines.
*
* <p>A premium pricing engine is responsible solely for determining whether a given label is
* premium or not, and if it is, how much it should cost.
*/
public interface PremiumPricingEngine {
/** /**
* Returns the prices for the given fully qualified domain name at the given time. * Returns the prices for the given fully qualified domain name at the given time.
@ -31,9 +36,9 @@ public interface PricingEngine {
public DomainPrices getDomainPrices(String fullyQualifiedDomainName, DateTime priceTime); public DomainPrices getDomainPrices(String fullyQualifiedDomainName, DateTime priceTime);
/** /**
* A class containing information on prices for a specific domain name. * A class containing information on premium prices for a specific domain name.
* *
* <p>Any implementation of PricingEngine is responsible for determining all of these. * <p>Any implementation of PremiumPricingEngine is responsible for determining all of these.
*/ */
public static class DomainPrices { public static class DomainPrices {
@ -42,20 +47,17 @@ public interface PricingEngine {
// create, renew, restore, and transfer. // create, renew, restore, and transfer.
private Money createCost; private Money createCost;
private Money renewCost; private Money renewCost;
private Optional<Money> oneTimeFee;
private Optional<String> feeClass; private Optional<String> feeClass;
static DomainPrices create( static DomainPrices create(
boolean isPremium, boolean isPremium,
Money createCost, Money createCost,
Money renewCost, Money renewCost,
Optional<Money> oneTimeFee,
Optional<String> feeClass) { Optional<String> feeClass) {
DomainPrices instance = new DomainPrices(); DomainPrices instance = new DomainPrices();
instance.isPremium = isPremium; instance.isPremium = isPremium;
instance.createCost = createCost; instance.createCost = createCost;
instance.renewCost = renewCost; instance.renewCost = renewCost;
instance.oneTimeFee = oneTimeFee;
instance.feeClass = feeClass; instance.feeClass = feeClass;
return instance; return instance;
} }
@ -75,15 +77,6 @@ public interface PricingEngine {
return renewCost; return renewCost;
} }
/**
* Returns the one time fee to register a domain if there is one.
*
* <p>This is primarily used for EAP registration fees.
*/
public Optional<Money> getOneTimeFee() {
return oneTimeFee;
}
/** Returns the fee class of the cost (used for the Fee extension). */ /** Returns the fee class of the cost (used for the Fee extension). */
public Optional<String> getFeeClass() { public Optional<String> getFeeClass() {
return feeClass; return feeClass;

View file

@ -35,7 +35,7 @@ import org.joda.time.DateTime;
import javax.inject.Inject; import javax.inject.Inject;
/** A premium list pricing engine that stores static pricing information in Datastore entities. */ /** A premium list pricing engine that stores static pricing information in Datastore entities. */
public final class StaticPremiumListPricingEngine implements PricingEngine { public final class StaticPremiumListPricingEngine implements PremiumPricingEngine {
@Inject StaticPremiumListPricingEngine() {} @Inject StaticPremiumListPricingEngine() {}
@ -61,7 +61,6 @@ public final class StaticPremiumListPricingEngine implements PricingEngine {
premiumPrice.isPresent(), premiumPrice.isPresent(),
premiumPrice.or(registry.getStandardCreateCost()), premiumPrice.or(registry.getStandardCreateCost()),
premiumPrice.or(registry.getStandardRenewCost(priceTime)), premiumPrice.or(registry.getStandardRenewCost(priceTime)),
Optional.<Money>absent(),
Optional.<String>fromNullable(feeClass)); Optional.<String>fromNullable(feeClass));
} }
} }

View file

@ -57,7 +57,7 @@ import google.registry.model.ImmutableObject;
import google.registry.model.common.EntityGroupRoot; import google.registry.model.common.EntityGroupRoot;
import google.registry.model.common.TimedTransitionProperty; import google.registry.model.common.TimedTransitionProperty;
import google.registry.model.common.TimedTransitionProperty.TimedTransition; import google.registry.model.common.TimedTransitionProperty.TimedTransition;
import google.registry.model.pricing.PricingEngine; import google.registry.model.pricing.PremiumPricingEngine;
import google.registry.model.pricing.StaticPremiumListPricingEngine; import google.registry.model.pricing.StaticPremiumListPricingEngine;
import google.registry.model.registry.label.PremiumList; import google.registry.model.registry.label.PremiumList;
import google.registry.model.registry.label.ReservedList; import google.registry.model.registry.label.ReservedList;
@ -533,7 +533,7 @@ public class Registry extends ImmutableObject implements Buildable {
return claimsPeriodEnd; return claimsPeriodEnd;
} }
public String getPricingEngineClassName() { public String getPremiumPricingEngineClassName() {
return pricingEngineClassName; return pricingEngineClassName;
} }
@ -603,7 +603,8 @@ public class Registry extends ImmutableObject implements Buildable {
return this; return this;
} }
public Builder setPricingEngineClass(Class<? extends PricingEngine> pricingEngineClass) { public Builder setPremiumPricingEngineClass(
Class<? extends PremiumPricingEngine> pricingEngineClass) {
getInstance().pricingEngineClassName = getInstance().pricingEngineClassName =
checkArgumentNotNull(pricingEngineClass).getCanonicalName(); checkArgumentNotNull(pricingEngineClass).getCanonicalName();
return this; return this;

View file

@ -16,7 +16,7 @@ package google.registry.pricing;
import dagger.Component; import dagger.Component;
import google.registry.model.pricing.PricingEngine; import google.registry.model.pricing.PremiumPricingEngine;
import java.util.Map; import java.util.Map;
@ -32,5 +32,5 @@ import javax.inject.Singleton;
@Singleton @Singleton
@Component(modules = {PricingModule.class}) @Component(modules = {PricingModule.class})
interface PricingComponent { interface PricingComponent {
Map<Class<? extends PricingEngine>, PricingEngine> pricingEngines(); Map<Class<? extends PremiumPricingEngine>, PremiumPricingEngine> premiumPricingEngines();
} }

View file

@ -22,8 +22,8 @@ import com.google.common.base.Function;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import google.registry.model.pricing.PricingEngine; import google.registry.model.pricing.PremiumPricingEngine;
import google.registry.model.pricing.PricingEngine.DomainPrices; import google.registry.model.pricing.PremiumPricingEngine.DomainPrices;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import org.joda.money.Money; import org.joda.money.Money;
@ -33,22 +33,22 @@ import java.util.Map;
/** /**
* A global proxy providing static methods for getting premium prices that dispatches requests * A global proxy providing static methods for getting premium prices that dispatches requests
* correctly to the relevant {@link PricingEngine} implementation per TLD. * correctly to the relevant {@link PremiumPricingEngine} implementation per TLD.
*/ */
public final class PricingEngineProxy { public final class PricingEngineProxy {
private static final Map<Class<? extends PricingEngine>, PricingEngine> pricingEngineClasses = private static final Map<Class<? extends PremiumPricingEngine>, PremiumPricingEngine>
DaggerPricingComponent.create().pricingEngines(); premiumPricingEngineClasses = DaggerPricingComponent.create().premiumPricingEngines();
// Dagger map keys have to be provided with constant values that are known at compile time, so it // Dagger map keys have to be provided with constant values that are known at compile time, so it
// can't be done using clazz.getCanonicalName(). So we construct the map by canonical name here, // can't be done using clazz.getCanonicalName(). So we construct the map by canonical name here,
// at runtime. // at runtime.
private static final ImmutableMap<String, PricingEngine> pricingEngines = private static final ImmutableMap<String, PremiumPricingEngine> premiumPricingEngines =
Maps.uniqueIndex( Maps.uniqueIndex(
pricingEngineClasses.values(), premiumPricingEngineClasses.values(),
new Function<PricingEngine, String>() { new Function<PremiumPricingEngine, String>() {
@Override @Override
public String apply(PricingEngine pricingEngine) { public String apply(PremiumPricingEngine pricingEngine) {
return pricingEngine.getClass().getCanonicalName(); return pricingEngine.getClass().getCanonicalName();
}}); }});
@ -66,13 +66,13 @@ public final class PricingEngineProxy {
/** /**
* Returns the full {@link DomainPrices} details for the given domain name by dispatching to the * Returns the full {@link DomainPrices} details for the given domain name by dispatching to the
* appropriate {@link PricingEngine} based on what is configured for the TLD that the domain is * appropriate {@link PremiumPricingEngine} based on what is configured for the TLD that the
* under. * domain is under.
*/ */
public static DomainPrices getPricesForDomainName(String domainName, DateTime priceTime) { public static DomainPrices getPricesForDomainName(String domainName, DateTime priceTime) {
String tld = getTldFromDomainName(domainName); String tld = getTldFromDomainName(domainName);
String clazz = Registry.get(tld).getPricingEngineClassName(); String clazz = Registry.get(tld).getPremiumPricingEngineClassName();
PricingEngine engine = pricingEngines.get(clazz); PremiumPricingEngine engine = premiumPricingEngines.get(clazz);
checkState(engine != null, "Could not load pricing engine %s for TLD %s", clazz, tld); checkState(engine != null, "Could not load pricing engine %s for TLD %s", clazz, tld);
return engine.getDomainPrices(domainName, priceTime); return engine.getDomainPrices(domainName, priceTime);
} }

View file

@ -19,29 +19,29 @@ import dagger.Module;
import dagger.Provides; import dagger.Provides;
import dagger.multibindings.IntoMap; import dagger.multibindings.IntoMap;
import google.registry.model.pricing.PricingEngine; import google.registry.model.pricing.PremiumPricingEngine;
import google.registry.model.pricing.StaticPremiumListPricingEngine; import google.registry.model.pricing.StaticPremiumListPricingEngine;
/** /**
* Dagger module for injecting pricing engines. * Dagger module for injecting pricing engines.
* *
* <p>To add a new pricing engine, create a new class that implements {@link PricingEngine}, and add * <p>To add a new pricing engine, create a new class that implements {@link PremiumPricingEngine},
* a module that provides an instance of PricingEngine with a <code>PricingEngineClassKey</code> * and add a module that provides an instance of PricingEngine with a
* annotation with the class of the implementation and also <code>@Provides @IntoMap</code> * <code>PricingEngineClassKey</code> annotation with the class of the implementation and also
* annotations. * <code>@Provides @IntoMap</code> annotations.
*/ */
@Module @Module
public class PricingModule { public class PricingModule {
/** The annotation used for PricingEngine implementation keys. */ /** The annotation used for PricingEngine implementation keys. */
@MapKey @MapKey
@interface PricingEngineClassKey { @interface PremiumPricingEngineClassKey {
Class<? extends PricingEngine> value(); Class<? extends PremiumPricingEngine> value();
} }
@Provides @IntoMap @Provides @IntoMap
@PricingEngineClassKey(StaticPremiumListPricingEngine.class) @PremiumPricingEngineClassKey(StaticPremiumListPricingEngine.class)
static PricingEngine provideStaticPremiumList(StaticPremiumListPricingEngine engine) { static PremiumPricingEngine provideStaticPremiumList(StaticPremiumListPricingEngine engine) {
return engine; return engine;
} }
} }

View file

@ -245,7 +245,7 @@ abstract class CreateOrUpdateTldCommand extends MutatingCommand {
oldRegistry == null oldRegistry == null
? new Registry.Builder() ? new Registry.Builder()
.setTldStr(tld) .setTldStr(tld)
.setPricingEngineClass(StaticPremiumListPricingEngine.class) .setPremiumPricingEngineClass(StaticPremiumListPricingEngine.class)
: oldRegistry.asBuilder(); : oldRegistry.asBuilder();
if (escrow != null) { if (escrow != null) {

View file

@ -74,7 +74,7 @@ public class PremiumListTest {
persistResource( persistResource(
new Registry.Builder() new Registry.Builder()
.setTldStr("ghost") .setTldStr("ghost")
.setPricingEngineClass(StaticPremiumListPricingEngine.class) .setPremiumPricingEngineClass(StaticPremiumListPricingEngine.class)
.build()); .build());
assertThat(Registry.get("ghost").getPremiumList()).isNull(); assertThat(Registry.get("ghost").getPremiumList()).isNull();
assertThat(getPremiumPrice("blah", "ghost")).isAbsent(); assertThat(getPremiumPrice("blah", "ghost")).isAbsent();

View file

@ -26,7 +26,7 @@ import static org.joda.money.CurrencyUnit.USD;
import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.ImmutableSortedMap;
import google.registry.model.pricing.PricingEngine; import google.registry.model.pricing.PremiumPricingEngine;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.registry.label.PremiumList; import google.registry.model.registry.label.PremiumList;
import google.registry.testing.AppEngineRule; import google.registry.testing.AppEngineRule;
@ -147,7 +147,7 @@ public class PricingEngineProxyTest {
public void testFailure_cantLoadPricingEngine() throws Exception { public void testFailure_cantLoadPricingEngine() throws Exception {
createTld("example"); createTld("example");
persistResource( persistResource(
Registry.get("example").asBuilder().setPricingEngineClass(FakePricingEngine.class).build()); Registry.get("example").asBuilder().setPremiumPricingEngineClass(FakePricingEngine.class).build());
thrown.expect( thrown.expect(
IllegalStateException.class, IllegalStateException.class,
String.format( String.format(
@ -156,5 +156,5 @@ public class PricingEngineProxyTest {
getDomainCreateCost("bad.example", clock.nowUtc(), 1); getDomainCreateCost("bad.example", clock.nowUtc(), 1);
} }
private abstract static class FakePricingEngine implements PricingEngine {} private abstract static class FakePricingEngine implements PremiumPricingEngine {}
} }

View file

@ -235,7 +235,7 @@ public class DatastoreHelper {
.setServerStatusChangeBillingCost(Money.of(USD, 19)) .setServerStatusChangeBillingCost(Money.of(USD, 19))
// Always set a default premium list. Tests that don't want it can delete it. // Always set a default premium list. Tests that don't want it can delete it.
.setPremiumList(persistPremiumList(tld, DEFAULT_PREMIUM_LIST_CONTENTS.get())) .setPremiumList(persistPremiumList(tld, DEFAULT_PREMIUM_LIST_CONTENTS.get()))
.setPricingEngineClass(StaticPremiumListPricingEngine.class) .setPremiumPricingEngineClass(StaticPremiumListPricingEngine.class)
.build(); .build();
} }