Class TimedTransitionProperty<V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>>
- java.lang.Object
-
- com.google.common.collect.ForwardingObject
-
- com.google.common.collect.ForwardingMap<org.joda.time.DateTime,T>
-
- google.registry.model.common.TimedTransitionProperty<V,T>
-
- All Implemented Interfaces:
UnsafeSerializable
,java.io.Serializable
,java.util.Map<org.joda.time.DateTime,T>
public class TimedTransitionProperty<V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>> extends com.google.common.collect.ForwardingMap<org.joda.time.DateTime,T> implements UnsafeSerializable
An entity property whose value transitions over time. Each value it takes on becomes active at a corresponding instant, and remains active until the next transition occurs. At least one "start of time" value (corresponding to START_OF_TIME, i.e. the Unix epoch) must be provided so that the property will have a value for all possible times.This concept is naturally represented by a sorted map of
DateTime
toV
, but the App Engine Datastore cannot natively represent a map keyed on non-strings. Instead, we store an ordered list of transitions and use Objectify's @Mapify annotation to automatically recreate the sorted map on load from Datastore, which is used as a backing map for this property; the property itself also implements Map by way of extending ForwardingMap, so that this property can stored directly as the @Mapify field in the entity.The type parameter
T
specifies a user-defined subclass ofTimedTransition<V>
to use for storing the list of transitions. The user is given this choice of subclass so that the field of the value type stored in the transition can be given a customized name.- See Also:
- Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
TimedTransitionProperty.TimedTransition<V extends java.io.Serializable>
A transition to a value of typeV
at a certain time.static class
TimedTransitionProperty.TimeMapper
Mapper used with @Mapify extracting time from TimedTransition to use as key.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
checkValidity()
Checks whether this TimedTransitionProperty is in a valid state, i.e.TimedTransitionProperty<V,T>
copyUntilJustBefore(org.joda.time.DateTime asOfDate)
Returns a new immutableTimedTransitionProperty
containing the same transitions as the current object, up to but not including the desired date.TimedTransitionProperty<V,T>
copyWithAddedTransition(org.joda.time.DateTime transitionTime, V transitionValue, java.lang.Class<T> transitionClass, com.google.common.collect.ImmutableMultimap<V,V> allowedTransitions, java.lang.String allowedTransitionMapName)
Returns a new immutableTimedTransitionProperty
containing the same transitions as the current object, plus the additional specified transition.protected java.util.NavigableMap<org.joda.time.DateTime,T>
delegate()
static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>>
TimedTransitionProperty<V,T>forMapify(com.google.common.collect.ImmutableSortedMap<org.joda.time.DateTime,V> valueMap, java.lang.Class<T> timedTransitionSubclass)
Returns a new mutableTimedTransitionProperty
representing the given map of DateTime to value, with transitions constructed using the givenTimedTransition
subclass.static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>>
TimedTransitionProperty<V,T>forMapify(V valueAtStartOfTime, java.lang.Class<T> timedTransitionSubclass)
Returns a new mutableTimedTransitionProperty
representing the given value being set at start of time, constructed using the givenTimedTransition
subclass.static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>>
TimedTransitionProperty<V,T>fromValueMap(com.google.common.collect.ImmutableSortedMap<org.joda.time.DateTime,V> valueMap, java.lang.Class<T> timedTransitionSubclass)
Returns a new immutableTimedTransitionProperty
representing the given map of DateTime to value, with transitions constructed using the givenTimedTransition
subclass.org.joda.time.DateTime
getNextTransitionAfter(org.joda.time.DateTime time)
Returns the time of the next transition.V
getValueAtTime(org.joda.time.DateTime time)
Returns the value of the property that is active at the specified time.static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>>
TimedTransitionProperty<V,T>make(com.google.common.collect.ImmutableSortedMap<org.joda.time.DateTime,V> newTransitions, java.lang.Class<T> transitionClass, com.google.common.collect.ImmutableMultimap<V,V> allowedTransitions, java.lang.String allowedTransitionMapName, V initialValue, java.lang.String badInitialValueErrorMessage)
Validates a new set of transitions and returns the resulting TimedTransitionProperty map.com.google.common.collect.ImmutableSortedMap<org.joda.time.DateTime,V>
toValueMap()
Returns the map of DateTime to value that is the "natural" representation of this property.static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>>
voidvalidateTimedTransitionMap(java.util.NavigableMap<org.joda.time.DateTime,V> transitionMap, com.google.common.collect.ImmutableMultimap<V,V> allowedTransitions, java.lang.String mapName)
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.-
Methods inherited from class com.google.common.collect.ForwardingMap
clear, containsKey, containsValue, entrySet, equals, get, hashCode, isEmpty, keySet, put, putAll, remove, size, standardClear, standardContainsKey, standardContainsValue, standardEquals, standardHashCode, standardIsEmpty, standardPutAll, standardRemove, standardToString, values
-
-
-
-
Method Detail
-
fromValueMap
public static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>> TimedTransitionProperty<V,T> fromValueMap(com.google.common.collect.ImmutableSortedMap<org.joda.time.DateTime,V> valueMap, java.lang.Class<T> timedTransitionSubclass)
Returns a new immutableTimedTransitionProperty
representing the given map of DateTime to value, with transitions constructed using the givenTimedTransition
subclass.This method should be the normal method for constructing a
TimedTransitionProperty
.
-
copyUntilJustBefore
public TimedTransitionProperty<V,T> copyUntilJustBefore(org.joda.time.DateTime asOfDate)
Returns a new immutableTimedTransitionProperty
containing the same transitions as the current object, up to but not including the desired date. All transitions on or after that date will be deleted.- Parameters:
asOfDate
- the date before which transitions should be retained
-
copyWithAddedTransition
public TimedTransitionProperty<V,T> copyWithAddedTransition(org.joda.time.DateTime transitionTime, V transitionValue, java.lang.Class<T> transitionClass, com.google.common.collect.ImmutableMultimap<V,V> allowedTransitions, java.lang.String allowedTransitionMapName)
Returns a new immutableTimedTransitionProperty
containing the same transitions as the current object, plus the additional specified transition.- Parameters:
transitionTime
- the time of the new transitiontransitionValue
- the value of the new transitiontransitionClass
- the class of transitions in this mapallowedTransitions
- map of all possible state-to-state transitionsallowedTransitionMapName
- transition map description string for error messages
-
make
public static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>> TimedTransitionProperty<V,T> make(com.google.common.collect.ImmutableSortedMap<org.joda.time.DateTime,V> newTransitions, java.lang.Class<T> transitionClass, com.google.common.collect.ImmutableMultimap<V,V> allowedTransitions, java.lang.String allowedTransitionMapName, V initialValue, java.lang.String badInitialValueErrorMessage)
Validates a new set of transitions and returns the resulting TimedTransitionProperty map.- Parameters:
newTransitions
- map from date time to transition valuetransitionClass
- the class of transitions in this mapallowedTransitions
- optional map of all possible state-to-state transitionsallowedTransitionMapName
- optional transition map description string for error messagesinitialValue
- optional initial value; if present, the first transition must have this valuebadInitialValueErrorMessage
- option error message string if the initial value is wrong
-
validateTimedTransitionMap
public static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>> void validateTimedTransitionMap(@Nullable java.util.NavigableMap<org.joda.time.DateTime,V> transitionMap, com.google.common.collect.ImmutableMultimap<V,V> allowedTransitions, java.lang.String mapName)
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.
-
forMapify
public static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>> TimedTransitionProperty<V,T> forMapify(com.google.common.collect.ImmutableSortedMap<org.joda.time.DateTime,V> valueMap, java.lang.Class<T> timedTransitionSubclass)
Returns a new mutableTimedTransitionProperty
representing the given map of DateTime to value, with transitions constructed using the givenTimedTransition
subclass.This method should only be used for initializing fields that are declared with the @Mapify annotation. The map for those fields must be mutable so that Objectify can load values from Datastore into the map, but clients should still never mutate the field's map directly.
-
forMapify
public static <V extends java.io.Serializable,T extends TimedTransitionProperty.TimedTransition<V>> TimedTransitionProperty<V,T> forMapify(V valueAtStartOfTime, java.lang.Class<T> timedTransitionSubclass)
Returns a new mutableTimedTransitionProperty
representing the given value being set at start of time, constructed using the givenTimedTransition
subclass.This method should only be used for initializing fields that are declared with the @Mapify annotation. The map for those fields must be mutable so that Objectify can load values from Datastore into the map, but clients should still never mutate the field's map directly.
-
checkValidity
public void checkValidity()
Checks whether this TimedTransitionProperty is in a valid state, i.e. whether it has a transition entry for START_OF_TIME, and throws IllegalStateException if not.
-
delegate
protected java.util.NavigableMap<org.joda.time.DateTime,T> delegate()
- Specified by:
delegate
in classcom.google.common.collect.ForwardingMap<org.joda.time.DateTime,T extends TimedTransitionProperty.TimedTransition<V>>
-
toValueMap
public com.google.common.collect.ImmutableSortedMap<org.joda.time.DateTime,V> toValueMap()
Returns the map of DateTime to value that is the "natural" representation of this property.
-
getValueAtTime
public V getValueAtTime(org.joda.time.DateTime time)
Returns the value of the property that is active at the specified time. The active value for a time before START_OF_TIME is extrapolated to be the value that is active at START_OF_TIME.
-
getNextTransitionAfter
@Nullable public org.joda.time.DateTime getNextTransitionAfter(org.joda.time.DateTime time)
Returns the time of the next transition. Returns null if there is no subsequent transition.
-
-