Class ModifiableMetadata
- Object
-
- AbstractMetadata
-
- ModifiableMetadata
-
- All Implemented Interfaces:
Emptiable,LenientComparable
- Direct Known Subclasses:
ISOMetadata
public abstract class ModifiableMetadata extends AbstractMetadata
Base class of metadata having an editable content. Newly createdModifiableMetadataare initially in editable state. The metadata can be populated using the setter methods provided by subclasses, then transition to the final state for making it safe to share by many consumers.Tip for subclass implementationsSubclasses can follow the pattern below for everygetandsetmethods, with a different processing for singleton value or for collections.public class MyMetadata { // ==== Example for a singleton value ============================= private Foo property; public Foo getProperty() { return property; } public void setProperty(Foo newValue) { checkWritePermission(); property = newValue; } // ==== Example for a collection ================================== private Collection<Foo> properties; public Collection<Foo> getProperties() { return properties = nonNullCollection(properties, Foo.class); } public void setProperties(Collection<Foo> newValues) { // the call to checkWritePermission() is implicit properties = writeCollection(newValues, properties, Foo.class); } }- Since:
- 0.3
Defined in the
sis-metadatamodule
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classModifiableMetadata.StateWhether the metadata is still editable or has been made final.
-
Constructor Summary
Constructors Modifier Constructor Description protectedModifiableMetadata()Constructs an initially empty metadata.
-
Method Summary
All Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description protected voidcheckWritePermission()Deprecated.Replaced bycheckWritePermission(Object).protected voidcheckWritePermission(Object current)Checks if changes in the metadata are allowed.protected <E> Class<? extends Collection<E>>collectionType(Class<E> elementType)Returns the type of collection to use for the given type.protected <E> Collection<E>copyCollection(Collection<? extends E> source, Class<E> elementType)Creates a list or set with the content of thesourcecollection, or returnsnullif the source isnullor empty.protected <E> List<E>copyList(Collection<? extends E> source, Class<E> elementType)Creates a list with the content of thesourcecollection, or returnsnullif the source isnullor empty.protected <K,V>
Map<K,V>copyMap(Map<? extends K,? extends V> source, Class<K> keyType)Creates a map with the content of thesourcemap, or returnsnullif the source isnullor empty.protected <E> Set<E>copySet(Collection<? extends E> source, Class<E> elementType)Creates a set with the content of thesourcecollection, or returnsnullif the source isnullor empty.voidfreeze()Deprecated.Replaced bytransition(State.FINAL).booleanisModifiable()Deprecated.Replaced bystate() !protected <E> Collection<E>nonNullCollection(Collection<E> current, Class<E> elementType)Returns the specified collection, or a new one ifcurrentis null.protected <E> List<E>nonNullList(List<E> current, Class<E> elementType)Returns the specified list, or a new one ifcurrentis null.protected <K,V>
Map<K,V>nonNullMap(Map<K,V> current, Class<K> keyType)Returns the specified map, or a new one ifcurrentis null.protected <E> Set<E>nonNullSet(Set<E> current, Class<E> elementType)Returns the specified set, or a new one ifcurrentis null.protected <E> Collection<E>singleton(E value, Class<E> elementType)Creates a singleton list or set containing only the given value, if non-null.ModifiableMetadata.Statestate()Tells whether this instance of metadata is editable.booleantransitionTo(ModifiableMetadata.State target)Requests this metadata instance and (potentially) all its children to transition to a new state.AbstractMetadataunmodifiable()Deprecated.Replaced byMetadataCopier.forModifiable(getStandard()).copy(this).transition(State.FINAL).protected <E> Collection<E>writeCollection(Collection<? extends E> source, Collection<E> target, Class<E> elementType)Writes the content of thesourcecollection into thetargetlist or set, creating it if needed.protected <E> List<E>writeList(Collection<? extends E> source, List<E> target, Class<E> elementType)Writes the content of thesourcecollection into thetargetlist, creating it if needed.protected <K,V>
Map<K,V>writeMap(Map<? extends K,? extends V> source, Map<K,V> target, Class<K> keyType)Writes the content of thesourcemap into thetargetmap, creating it if needed.protected <E> Set<E>writeSet(Collection<? extends E> source, Set<E> target, Class<E> elementType)Writes the content of thesourcecollection into thetargetset, creating it if needed.-
Methods inherited from class AbstractMetadata
asMap, asTreeTable, equals, equals, getInterface, getStandard, hashCode, isEmpty, prune, toString
-
-
-
-
Constructor Detail
-
ModifiableMetadata
protected ModifiableMetadata()
Constructs an initially empty metadata. The initial state isModifiableMetadata.State.EDITABLE.
-
-
Method Detail
-
state
public ModifiableMetadata.State state()
Tells whether this instance of metadata is editable. This is initiallyModifiableMetadata.State.EDITABLEfor newModifiableMetadatainstances, but can be changed by a call totransitionTo(State).ModifiableMetadata.State.FINALimplies that all properties are also final. This recursivity does not necessarily apply to other states. For exampleModifiableMetadata.State.EDITABLEdoes not imply that allModifiableMetadatachildren are also editable.API note: theModifiableMetadatastate is not a metadata per se, but rather an information about this particular instance of a metadata class. Two metadata instances may be in different states but still have the same metadata content. For this reason, this method does not havegetprefix for avoiding confusion with getter and setter methods of metadata properties.- Returns:
- the state (editable, completable or final) of this
ModifiableMetadatainstance. - Since:
- 1.0
-
transitionTo
public boolean transitionTo(ModifiableMetadata.State target)
Requests this metadata instance and (potentially) all its children to transition to a new state. The action performed by this method depends on the source state and the given target state, as listed in the following table:
The effect of invoking this method may be recursive. For example transitioning toState transitions Current state Target state Action Any Same Does nothing and returns false.ModifiableMetadata.State.EDITABLEModifiableMetadata.State.COMPLETABLEMarks this metadata and all children as completable. Any ModifiableMetadata.State.FINALMarks this metadata and all children as unmodifiable. ModifiableMetadata.State.FINALAny other Throws UnmodifiableMetadataException.ModifiableMetadata.State.FINALimplies transitioning all childrenModifiableMetadatainstances to the final state too.- Parameters:
target- the desired new state.- Returns:
trueif the state of thisModifiableMetadatachanged as a result of this method call.- Throws:
UnmodifiableMetadataException- if a transition to a less restrictive state (e.g. fromModifiableMetadata.State.FINALtoModifiableMetadata.State.EDITABLE) was attempted.- Since:
- 1.0
-
isModifiable
@Deprecated public final boolean isModifiable()
Returnstrueif this metadata is modifiable. This method returnsfalseiffreeze()has been invoked on this object.- Returns:
trueif this metadata is modifiable.- See Also:
freeze(),checkWritePermission()
-
unmodifiable
@Deprecated public AbstractMetadata unmodifiable()
Deprecated.Replaced byMetadataCopier.forModifiable(getStandard()).copy(this).transition(State.FINAL).Returns an unmodifiable copy of this metadata. Any attempt to modify a property of the returned object will throw anUnmodifiableMetadataException. The state of this object is not modified.This method is useful for reusing the same metadata object as a template. For example:
The default implementation makes the following choice:DefaultCitation myCitation = new DefaultCitation(); myCitation.setTitle(new SimpleInternationalString("The title of my book")); myCitation.setEdition(new SimpleInternationalString("First edition")); final Citation firstEdition = (Citation) myCitation.unmodifiable(); myCitation.setEdition(new SimpleInternationalString("Second edition")); final Citation secondEdition = (Citation) myCitation.unmodifiable(); // The title of the second edition is unchanged compared to the first edition.- Returns:
- an unmodifiable copy of this metadata.
- See Also:
MetadataCopier
-
freeze
@Deprecated public void freeze()
Deprecated.Replaced bytransition(State.FINAL).Declares this metadata and all its properties as unmodifiable. Any attempt to modify a property after this method call will throw anUnmodifiableMetadataException. If this metadata is already unmodifiable, then this method does nothing.Subclasses usually do not need to override this method since the default implementation performs its work using Java reflection.
- See Also:
state(),checkWritePermission()
-
checkWritePermission
@Deprecated protected void checkWritePermission() throws UnmodifiableMetadataException
Deprecated.Replaced bycheckWritePermission(Object).- Throws:
UnmodifiableMetadataException- if this metadata is unmodifiable.
-
checkWritePermission
protected void checkWritePermission(Object current) throws UnmodifiableMetadataException
Checks if changes in the metadata are allowed. AllsetFoo(…)methods in subclasses shall invoke this method (directly or indirectly) before to apply any change. The current property value should be specified in argument.- Parameters:
current- the current value, ornullif none.- Throws:
UnmodifiableMetadataException- if this metadata is unmodifiable.- Since:
- 1.0
- See Also:
state()
-
writeList
protected final <E> List<E> writeList(Collection<? extends E> source, List<E> target, Class<E> elementType) throws UnmodifiableMetadataException
Writes the content of thesourcecollection into thetargetlist, creating it if needed. This method performs the following steps:- Invokes
checkWritePermission(Object)in order to ensure that this metadata is modifiable. - If
sourceis null or empty, returnsnull(meaning that the metadata property is not provided). - If
targetis null, creates a newList. - Copies the content of the given
sourceinto the target.
- Type Parameters:
E- the type represented by theClassargument.- Parameters:
source- the source list, ornull.target- the target list, ornullif not yet created.elementType- the base type of elements to put in the list.- Returns:
- a list (possibly the
targetinstance) containing thesourceelements, ornullif the source was null. - Throws:
UnmodifiableMetadataException- if this metadata is unmodifiable.- See Also:
nonNullList(List, Class)
- Invokes
-
writeSet
protected final <E> Set<E> writeSet(Collection<? extends E> source, Set<E> target, Class<E> elementType) throws UnmodifiableMetadataException
Writes the content of thesourcecollection into thetargetset, creating it if needed. This method performs the following steps:- Invokes
checkWritePermission(Object)in order to ensure that this metadata is modifiable. - If
sourceis null or empty, returnsnull(meaning that the metadata property is not provided). - If
targetis null, creates a newSet. - Copies the content of the given
sourceinto the target.
- Type Parameters:
E- the type represented by theClassargument.- Parameters:
source- the source set, ornull.target- the target set, ornullif not yet created.elementType- the base type of elements to put in the set.- Returns:
- a set (possibly the
targetinstance) containing thesourceelements, ornullif the source was null. - Throws:
UnmodifiableMetadataException- if this metadata is unmodifiable.- See Also:
nonNullSet(Set, Class)
- Invokes
-
writeCollection
protected final <E> Collection<E> writeCollection(Collection<? extends E> source, Collection<E> target, Class<E> elementType) throws UnmodifiableMetadataException
Writes the content of thesourcecollection into thetargetlist or set, creating it if needed. This method performs the following steps:- Invokes
checkWritePermission(Object)in order to ensure that this metadata is modifiable. - If
sourceis null or empty, returnsnull(meaning that the metadata property is not provided). - If
targetis null, creates a newSetor a newListdepending on the value returned bycollectionType(Class). - Copies the content of the given
sourceinto the target.
Choosing a collection typeImplementations shall invokewriteListorwriteSetmethods instead than this method when the collection type is enforced by ISO specification. When the type is not enforced by the specification, some freedom are allowed at implementer choice. The default implementation invokescollectionType(Class)in order to get a hint about whether aListor aSetshould be used.- Type Parameters:
E- the type represented by theClassargument.- Parameters:
source- the source collection, ornull.target- the target collection, ornullif not yet created.elementType- the base type of elements to put in the collection.- Returns:
- a collection (possibly the
targetinstance) containing thesourceelements, ornullif the source was null. - Throws:
UnmodifiableMetadataException- if this metadata is unmodifiable.
- Invokes
-
writeMap
protected final <K,V> Map<K,V> writeMap(Map<? extends K,? extends V> source, Map<K,V> target, Class<K> keyType) throws UnmodifiableMetadataException
Writes the content of thesourcemap into thetargetmap, creating it if needed. This method performs the following steps:- Invokes
checkWritePermission(Object)in order to ensure that this metadata is modifiable. - If
sourceis null or empty, returnsnull(meaning that the metadata property is not provided). - If
targetis null, creates a newMap. - Copies the content of the given
sourceinto the target.
- Type Parameters:
K- the type of keys represented by theClassargument.V- the type of values in the map.- Parameters:
source- the source map, ornull.target- the target map, ornullif not yet created.keyType- the base type of keys to put in the map.- Returns:
- a map (possibly the
targetinstance) containing thesourceentries, ornullif the source was null. - Throws:
UnmodifiableMetadataException- if this metadata is unmodifiable.- Since:
- 1.0
- See Also:
nonNullMap(Map, Class)
- Invokes
-
copyList
protected final <E> List<E> copyList(Collection<? extends E> source, Class<E> elementType)
Creates a list with the content of thesourcecollection, or returnsnullif the source isnullor empty. This is a convenience method for copying fields in subclass copy constructors.- Type Parameters:
E- the type represented by theClassargument.- Parameters:
source- the source collection, ornull.elementType- the base type of elements to put in the list.- Returns:
- a list containing the
sourceelements, ornullif the source was null or empty.
-
copySet
protected final <E> Set<E> copySet(Collection<? extends E> source, Class<E> elementType)
Creates a set with the content of thesourcecollection, or returnsnullif the source isnullor empty. This is a convenience method for copying fields in subclass copy constructors.- Type Parameters:
E- the type represented by theClassargument.- Parameters:
source- the source collection, ornull.elementType- the base type of elements to put in the set.- Returns:
- a set containing the
sourceelements, ornullif the source was null or empty.
-
copyCollection
protected final <E> Collection<E> copyCollection(Collection<? extends E> source, Class<E> elementType)
Creates a list or set with the content of thesourcecollection, or returnsnullif the source isnullor empty. This is a convenience method for copying fields in subclass copy constructors.The collection type is selected as described in the
nonNullCollection(Collection, Class).- Type Parameters:
E- the type represented by theClassargument.- Parameters:
source- the source collection, ornull.elementType- the base type of elements to put in the collection.- Returns:
- a collection containing the
sourceelements, ornullif the source was null or empty.
-
copyMap
protected final <K,V> Map<K,V> copyMap(Map<? extends K,? extends V> source, Class<K> keyType)
Creates a map with the content of thesourcemap, or returnsnullif the source isnullor empty. This is a convenience method for copying fields in subclass copy constructors.- Type Parameters:
K- the type of keys represented by theClassargument.V- the type of values in the map.- Parameters:
source- the source map, ornull.keyType- the base type of keys to put in the map.- Returns:
- a map containing the
sourceentries, ornullif the source was null or empty. - Since:
- 1.0
-
singleton
protected final <E> Collection<E> singleton(E value, Class<E> elementType)
Creates a singleton list or set containing only the given value, if non-null. This is a convenience method for initializing fields in subclass constructors.The collection type is selected as described in the
nonNullCollection(Collection, Class).- Type Parameters:
E- the type represented by theClassargument.- Parameters:
value- the singleton value to put in the returned collection, ornull.elementType- the element type (used only ifvalueis non-null).- Returns:
- a new modifiable collection containing the given value,
or
nullif the given value was null.
-
nonNullList
protected final <E> List<E> nonNullList(List<E> current, Class<E> elementType)
Returns the specified list, or a new one ifcurrentis null. This is a convenience method for implementation ofgetFoo()methods.- Type Parameters:
E- the type represented by theClassargument.- Parameters:
current- the existing list, ornullif the list has not yet been created.elementType- the element type (used only ifcurrentis null).- Returns:
current, or a new list ifcurrentis null.
-
nonNullSet
protected final <E> Set<E> nonNullSet(Set<E> current, Class<E> elementType)
Returns the specified set, or a new one ifcurrentis null. This is a convenience method for implementation ofgetFoo()methods.- Type Parameters:
E- the type represented by theClassargument.- Parameters:
current- the existing set, ornullif the set has not yet been created.elementType- the element type (used only ifcurrentis null).- Returns:
current, or a new set ifcurrentis null.
-
nonNullCollection
protected final <E> Collection<E> nonNullCollection(Collection<E> current, Class<E> elementType)
Returns the specified collection, or a new one ifcurrentis null. This is a convenience method for implementation ofgetFoo()methods.Choosing a collection typeImplementations shall invokenonNullList(…)ornonNullSet(…)instead than this method when the collection type is enforced by ISO specification. When the type is not enforced by the specification, some freedom are allowed at implementer choice. The default implementation invokescollectionType(Class)in order to get a hint about whether aListor aSetshould be used.- Type Parameters:
E- the type represented by theClassargument.- Parameters:
current- the existing collection, ornullif the collection has not yet been created.elementType- the element type (used only ifcurrentis null).- Returns:
current, or a new collection ifcurrentis null.
-
nonNullMap
protected final <K,V> Map<K,V> nonNullMap(Map<K,V> current, Class<K> keyType)
Returns the specified map, or a new one ifcurrentis null. This is a convenience method for implementation ofgetFoo()methods.- Type Parameters:
K- the type of keys represented by theClassargument.V- the type of values in the map.- Parameters:
current- the existing map, ornullif the map has not yet been created.keyType- the key type (used only ifcurrentis null).- Returns:
current, or a new map ifcurrentis null.- Since:
- 1.0
-
collectionType
protected <E> Class<? extends Collection<E>> collectionType(Class<E> elementType)
Returns the type of collection to use for the given type. The current implementation can return only two values:Set.classif the property should not accept duplicated values, orList.classotherwise. Future SIS versions may accept other types.The default implementation returns
Set.classif the element type is assignable toCodeList,Enum,String,Charset,LocaleorCurrency, andList.classotherwise. Subclasses can override this method for choosing different kind of collections. Note however thatSetshould be used only with immutable element types, for hash code stability.- Type Parameters:
E- the type of elements in the collection to be created.- Parameters:
elementType- the type of elements in the collection to be created.- Returns:
List.classorSet.classdepending on whether the property shall accept duplicated values or not.
-
-