mirror of
https://github.com/google/nomulus.git
synced 2025-04-30 12:07:51 +02:00
Add additional methods for manipulating timed transition maps
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=130311938
This commit is contained in:
parent
316226db68
commit
0e794c790a
5 changed files with 103 additions and 4 deletions
|
@ -107,7 +107,7 @@ public class DomainInfoFlow extends BaseDomainInfoFlow<DomainResource, Builder>
|
||||||
Optional<RegistryExtraFlowLogic> extraLogicManager =
|
Optional<RegistryExtraFlowLogic> extraLogicManager =
|
||||||
RegistryExtraFlowLogicProxy.newInstanceForTld(existingResource.getTld());
|
RegistryExtraFlowLogicProxy.newInstanceForTld(existingResource.getTld());
|
||||||
if (extraLogicManager.isPresent()) {
|
if (extraLogicManager.isPresent()) {
|
||||||
List<String> flags = extraLogicManager.get().getFlags(
|
List<String> flags = extraLogicManager.get().getExtensionFlags(
|
||||||
existingResource, this.getClientId(), now); // As-of date is always now for info commands.
|
existingResource, this.getClientId(), now); // As-of date is always now for info commands.
|
||||||
if (!flags.isEmpty()) {
|
if (!flags.isEmpty()) {
|
||||||
extensions.add(FlagsInfoResponseExtension.create(flags));
|
extensions.add(FlagsInfoResponseExtension.create(flags));
|
||||||
|
|
|
@ -26,8 +26,8 @@ import org.joda.time.DateTime;
|
||||||
*/
|
*/
|
||||||
public interface RegistryExtraFlowLogic {
|
public interface RegistryExtraFlowLogic {
|
||||||
|
|
||||||
/** Get the flags to be passed to the client in the EPP flags extension. */
|
/** Get the flags to be used in the EPP flags extension. This is used for EPP info commands. */
|
||||||
public List<String> getFlags(
|
public List<String> getExtensionFlags(
|
||||||
DomainResource domainResource, String clientIdentifier, DateTime asOfDate);
|
DomainResource domainResource, String clientIdentifier, DateTime asOfDate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -16,17 +16,22 @@ package google.registry.model.common;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.common.base.Preconditions.checkState;
|
import static com.google.common.base.Preconditions.checkState;
|
||||||
|
import static google.registry.util.CollectionUtils.nullToEmpty;
|
||||||
import static google.registry.util.DateTimeUtils.START_OF_TIME;
|
import static google.registry.util.DateTimeUtils.START_OF_TIME;
|
||||||
import static google.registry.util.DateTimeUtils.latestOf;
|
import static google.registry.util.DateTimeUtils.latestOf;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.ForwardingMap;
|
import com.google.common.collect.ForwardingMap;
|
||||||
|
import com.google.common.collect.ImmutableMultimap;
|
||||||
import com.google.common.collect.ImmutableSortedMap;
|
import com.google.common.collect.ImmutableSortedMap;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Ordering;
|
import com.google.common.collect.Ordering;
|
||||||
import com.googlecode.objectify.mapper.Mapper;
|
import com.googlecode.objectify.mapper.Mapper;
|
||||||
import google.registry.model.ImmutableObject;
|
import google.registry.model.ImmutableObject;
|
||||||
import google.registry.util.TypeUtils;
|
import google.registry.util.TypeUtils;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.NavigableMap;
|
import java.util.NavigableMap;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
@ -136,6 +141,99 @@ public class TimedTransitionProperty<V, T extends TimedTransitionProperty.TimedT
|
||||||
return new TimedTransitionProperty<>(backingMap.headMap(asOfDate, false));
|
return new TimedTransitionProperty<>(backingMap.headMap(asOfDate, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new immutable {@code TimedTransitionProperty} containing the same transitions as the
|
||||||
|
* current object, plus the additional specified transition.
|
||||||
|
*
|
||||||
|
* @param transitionTime the time of the new transition
|
||||||
|
* @param transitionValue the value of the new transition
|
||||||
|
* @param transitionClass the class of transitions in this map
|
||||||
|
* @param allowedTransitions map of all possible state-to-state transitions
|
||||||
|
* @param allowedTransitionMapName transition map description string for error messages
|
||||||
|
*/
|
||||||
|
public TimedTransitionProperty<V, T> copyWithAddedTransition(
|
||||||
|
DateTime transitionTime,
|
||||||
|
V transitionValue,
|
||||||
|
Class<T> transitionClass,
|
||||||
|
ImmutableMultimap<V, V> allowedTransitions,
|
||||||
|
String allowedTransitionMapName) {
|
||||||
|
ImmutableSortedMap<DateTime, V> currentMap = toValueMap();
|
||||||
|
checkArgument(
|
||||||
|
transitionTime.isAfter(currentMap.lastKey()),
|
||||||
|
"New transitions can only be appended after the last previous transition.");
|
||||||
|
Map<DateTime, V> newInnerMap = new HashMap<>(currentMap);
|
||||||
|
newInnerMap.put(transitionTime, transitionValue);
|
||||||
|
ImmutableSortedMap<DateTime, V> newMap =
|
||||||
|
ImmutableSortedMap.<DateTime, V>copyOf(newInnerMap);
|
||||||
|
validateTimedTransitionMap(newMap, allowedTransitions, allowedTransitionMapName);
|
||||||
|
return fromValueMap(newMap, transitionClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates a new set of transitions and returns the resulting TimedTransitionProperty map.
|
||||||
|
*
|
||||||
|
* @param newTransitions map from date time to transition value
|
||||||
|
* @param transitionClass the class of transitions in this map
|
||||||
|
* @param allowedTransitions optional map of all possible state-to-state transitions
|
||||||
|
* @param allowedTransitionMapName optional transition map description string for error messages
|
||||||
|
* @param initialValue optional initial value; if present, the first transition must have this
|
||||||
|
* value
|
||||||
|
* @param badInitialValueErrorMessage option error message string if the initial value is wrong
|
||||||
|
*/
|
||||||
|
public static <V, T extends TimedTransitionProperty.TimedTransition<V>>
|
||||||
|
TimedTransitionProperty<V, T> make(
|
||||||
|
ImmutableSortedMap<DateTime, V> newTransitions,
|
||||||
|
Class<T> transitionClass,
|
||||||
|
ImmutableMultimap<V, V> allowedTransitions,
|
||||||
|
String allowedTransitionMapName,
|
||||||
|
V initialValue,
|
||||||
|
String badInitialValueErrorMessage) {
|
||||||
|
validateTimedTransitionMap(
|
||||||
|
newTransitions,
|
||||||
|
allowedTransitions,
|
||||||
|
allowedTransitionMapName);
|
||||||
|
checkArgument(
|
||||||
|
newTransitions.firstEntry().getValue() == initialValue,
|
||||||
|
badInitialValueErrorMessage);
|
||||||
|
return fromValueMap(newTransitions, transitionClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates that a transition map is not null or empty, starts at START_OF_TIME, and has
|
||||||
|
* transitions which move from one value to another in allowed ways.
|
||||||
|
*/
|
||||||
|
public static <V, T extends TimedTransitionProperty.TimedTransition<V>>
|
||||||
|
void validateTimedTransitionMap(
|
||||||
|
@Nullable NavigableMap<DateTime, V> transitionMap,
|
||||||
|
ImmutableMultimap<V, V> allowedTransitions,
|
||||||
|
String mapName) {
|
||||||
|
checkArgument(
|
||||||
|
!nullToEmpty(transitionMap).isEmpty(), "%s map cannot be null or empty.", mapName);
|
||||||
|
checkArgument(
|
||||||
|
transitionMap.firstKey().equals(START_OF_TIME),
|
||||||
|
"%s map must start at START_OF_TIME.",
|
||||||
|
mapName);
|
||||||
|
|
||||||
|
// Check that all transitions between states are allowed.
|
||||||
|
Iterator<V> it = transitionMap.values().iterator();
|
||||||
|
V currentState = it.next();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
checkArgument(
|
||||||
|
allowedTransitions.containsKey(currentState),
|
||||||
|
"%s map cannot transition from %s.",
|
||||||
|
mapName,
|
||||||
|
currentState);
|
||||||
|
V nextState = it.next();
|
||||||
|
checkArgument(
|
||||||
|
allowedTransitions.containsEntry(currentState, nextState),
|
||||||
|
"%s map cannot transition from %s to %s.",
|
||||||
|
mapName,
|
||||||
|
currentState,
|
||||||
|
nextState);
|
||||||
|
currentState = nextState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a new mutable {@code TimedTransitionProperty} representing the given map of DateTime
|
* Returns a new mutable {@code TimedTransitionProperty} representing the given map of DateTime
|
||||||
* to value, with transitions constructed using the given {@code TimedTransition} subclass.
|
* to value, with transitions constructed using the given {@code TimedTransition} subclass.
|
||||||
|
|
|
@ -25,6 +25,7 @@ java_library(
|
||||||
]),
|
]),
|
||||||
resources = glob(["**/testdata/*.xml"]),
|
resources = glob(["**/testdata/*.xml"]),
|
||||||
deps = [
|
deps = [
|
||||||
|
"//java/com/google/common/annotations",
|
||||||
"//java/com/google/common/base",
|
"//java/com/google/common/base",
|
||||||
"//java/com/google/common/collect",
|
"//java/com/google/common/collect",
|
||||||
"//java/com/google/common/io",
|
"//java/com/google/common/io",
|
||||||
|
|
|
@ -30,7 +30,7 @@ import org.joda.time.DateTime;
|
||||||
public class TestExtraLogicManager implements RegistryExtraFlowLogic {
|
public class TestExtraLogicManager implements RegistryExtraFlowLogic {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getFlags(
|
public List<String> getExtensionFlags(
|
||||||
DomainResource domainResource, String clientIdentifier, DateTime asOfDate) {
|
DomainResource domainResource, String clientIdentifier, DateTime asOfDate) {
|
||||||
// Take the part before the period, split by dashes, and treat each part after the first as
|
// Take the part before the period, split by dashes, and treat each part after the first as
|
||||||
// a flag.
|
// a flag.
|
||||||
|
|
Loading…
Add table
Reference in a new issue