mirror of
https://github.com/google/nomulus.git
synced 2025-05-15 08:57:12 +02:00
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:
parent
366c5a344d
commit
6ba1d5e6df
11 changed files with 45 additions and 52 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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 {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue