- All Implemented Interfaces:
Emptiable
,LenientComparable
- Direct Known Subclasses:
ISOMetadata
ModifiableMetadata
are 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 implementations
Subclasses can follow the pattern below for everyget
and set
methods,
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
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic enum
Whether the metadata is still editable or has been made final. -
Constructor Summary
ModifierConstructorDescriptionprotected
Constructs an initially empty metadata. -
Method Summary
Modifier and TypeMethodDescriptionprotected void
checkWritePermission
(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 final <E> Collection
<E> copyCollection
(Collection<? extends E> source, Class<E> elementType) Creates a list or set with the content of thesource
collection, or returnsnull
if the source isnull
or empty.protected final <E> List
<E> copyList
(Collection<? extends E> source, Class<E> elementType) Creates a list with the content of thesource
collection, or returnsnull
if the source isnull
or empty.protected final <K,
V> Map <K, V> Creates a map with the content of thesource
map, or returnsnull
if the source isnull
or empty.protected final <E> Set
<E> copySet
(Collection<? extends E> source, Class<E> elementType) Creates a set with the content of thesource
collection, or returnsnull
if the source isnull
or empty.deepCopy
(ModifiableMetadata.State target) Copies (if necessary) this metadata and all its children.protected final <E> Collection
<E> nonNullCollection
(Collection<E> current, Class<E> elementType) Returns the specified collection, or a new one ifcurrent
is null.protected final <E> List
<E> nonNullList
(List<E> current, Class<E> elementType) Returns the specified list, or a new one ifcurrent
is null.protected final <K,
V> Map <K, V> nonNullMap
(Map<K, V> current, Class<K> keyType) Returns the specified map, or a new one ifcurrent
is null.protected final <E> Set
<E> nonNullSet
(Set<E> current, Class<E> elementType) Returns the specified set, or a new one ifcurrent
is null.protected final <E> Collection
<E> Creates a singleton list or set containing only the given value, if non-null.state()
Tells whether this instance of metadata is editable.boolean
Requests this metadata instance and (potentially) all its children to transition to a new state.protected final <E> Collection
<E> writeCollection
(Collection<? extends E> source, Collection<E> target, Class<E> elementType) Writes the content of thesource
collection into thetarget
list or set, creating it if needed.protected final <E> List
<E> writeList
(Collection<? extends E> source, List<E> target, Class<E> elementType) Writes the content of thesource
collection into thetarget
list, creating it if needed.protected final <K,
V> Map <K, V> Writes the content of thesource
map into thetarget
map, creating it if needed.protected final <E> Set
<E> writeSet
(Collection<? extends E> source, Set<E> target, Class<E> elementType) Writes the content of thesource
collection into thetarget
set, creating it if needed.Methods inherited from class AbstractMetadata
asMap, asTreeTable, equals, equals, getInterface, getStandard, hashCode, isEmpty, prune, toString
-
Constructor Details
-
ModifiableMetadata
protected ModifiableMetadata()Constructs an initially empty metadata. The initial state isModifiableMetadata.State.EDITABLE
.
-
-
Method Details
-
state
Tells whether this instance of metadata is editable. This is initiallyModifiableMetadata.State.EDITABLE
for newModifiableMetadata
instances, but can be changed by a call totransitionTo(State)
.ModifiableMetadata.State.FINAL
implies that all properties are also final. This recursivity does not necessarily apply to other states. For example,ModifiableMetadata.State.EDITABLE
does not imply that allModifiableMetadata
children are also editable.API note: theModifiableMetadata
state 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 haveget
prefix for avoiding confusion with getter and setter methods of metadata properties.- Returns:
- the state (editable, completable or final) of this
ModifiableMetadata
instance. - Since:
- 1.0
-
transitionTo
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:State transitions Current state Target state Action Any Same Does nothing and returns false
.ModifiableMetadata.State.EDITABLE
ModifiableMetadata.State.COMPLETABLE
Marks this metadata and all children as completable. Any ModifiableMetadata.State.FINAL
Marks this metadata and all children as unmodifiable. ModifiableMetadata.State.FINAL
Any other Throws UnmodifiableMetadataException
.ModifiableMetadata.State.FINAL
implies transitioning all childrenModifiableMetadata
instances to the final state too.- Parameters:
target
- the desired new state (editable, completable or final).- Returns:
true
if the state of thisModifiableMetadata
changed as a result of this method call.- Throws:
UnmodifiableMetadataException
- if a transition to a less restrictive state (e.g. fromModifiableMetadata.State.FINAL
toModifiableMetadata.State.EDITABLE
) was attempted.- Since:
- 1.0
-
deepCopy
Copies (if necessary) this metadata and all its children. Changes in the returned metadata will not affect thisModifiableMetadata
instance, and conversely. The returned metadata will be in the state specified by thetarget
argument. The state of thisModifiableMetadata
instance stay unchanged.As a special case, this method returns
this
if and only if the specified target isModifiableMetadata.State.FINAL
and thisModifiableMetadata
instance is already in final state. In that particular case, copies are not needed for protecting metadata against changes because neitherthis
or the returned value can be modified.This method is typically invoked for getting a modifiable metadata from an unmodifiable one:
Metadata source = ...; // Any implementation. DefaultMetadata md = DefaultMetadata.castOrCopy(source); md = (DefaultMetadata) md.deepCopy(DefaultMetadata.State.EDITABLE);
Alternative
If unconditional copy is desired, or if the metadata to copy may be arbitrary implementations of GeoAPI interfaces (i.e. not necessarily aModifiableMetadata
subclass), then the following code can be used instead:MetadataCopier copier = new MetadataCopier(MetadataStandard.ISO_19115); Metadata source = ...; // Any implementation. Metadata copy = copier.copy(Metadata.class, source);
Metadata
type in above example can be replaced by any other ISO 19115 type. Types from other standards can also be used if theMetadataStandard.ISO_19115
constant is replaced accordingly.- Parameters:
target
- the desired state (editable, completable or final).- Returns:
- a copy (except in above-cited special case) of this metadata in the specified state.
- Since:
- 1.1
- See Also:
-
checkWritePermission
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, ornull
if none.- Throws:
UnmodifiableMetadataException
- if this metadata is unmodifiable.- Since:
- 1.0
- See Also:
-
writeList
protected final <E> List<E> writeList(Collection<? extends E> source, List<E> target, Class<E> elementType) throws UnmodifiableMetadataException Writes the content of thesource
collection into thetarget
list, creating it if needed. This method performs the following steps:- Invokes
checkWritePermission(Object)
in order to ensure that this metadata is modifiable. - If
source
is null or empty, returnsnull
(meaning that the metadata property is not provided). - If
target
is null, creates a newList
. - Copies the content of the given
source
into the target.
- Type Parameters:
E
- the type represented by theClass
argument.- Parameters:
source
- the source list, ornull
.target
- the target list, ornull
if not yet created.elementType
- the base type of elements to put in the list.- Returns:
- a list (possibly the
target
instance) containing thesource
elements, ornull
if the source was null. - Throws:
UnmodifiableMetadataException
- if this metadata is unmodifiable.- See Also:
- Invokes
-
writeSet
protected final <E> Set<E> writeSet(Collection<? extends E> source, Set<E> target, Class<E> elementType) throws UnmodifiableMetadataException Writes the content of thesource
collection into thetarget
set, creating it if needed. This method performs the following steps:- Invokes
checkWritePermission(Object)
in order to ensure that this metadata is modifiable. - If
source
is null or empty, returnsnull
(meaning that the metadata property is not provided). - If
target
is null, creates a newSet
. - Copies the content of the given
source
into the target.
- Type Parameters:
E
- the type represented by theClass
argument.- Parameters:
source
- the source set, ornull
.target
- the target set, ornull
if not yet created.elementType
- the base type of elements to put in the set.- Returns:
- a set (possibly the
target
instance) containing thesource
elements, ornull
if the source was null. - Throws:
UnmodifiableMetadataException
- if this metadata is unmodifiable.- See Also:
- Invokes
-
writeCollection
protected final <E> Collection<E> writeCollection(Collection<? extends E> source, Collection<E> target, Class<E> elementType) throws UnmodifiableMetadataException Writes the content of thesource
collection into thetarget
list 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
source
is null or empty, returnsnull
(meaning that the metadata property is not provided). - If
target
is null, creates a newSet
or a newList
depending on the value returned bycollectionType(Class)
. - Copies the content of the given
source
into the target.
Choosing a collection type
Implementations shall invokewriteList
orwriteSet
methods instead of 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 aList
or aSet
should be used.- Type Parameters:
E
- the type represented by theClass
argument.- Parameters:
source
- the source collection, ornull
.target
- the target collection, ornull
if not yet created.elementType
- the base type of elements to put in the collection.- Returns:
- a collection (possibly the
target
instance) containing thesource
elements, ornull
if 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, throws UnmodifiableMetadataExceptionV> target, Class<K> keyType) Writes the content of thesource
map into thetarget
map, creating it if needed. This method performs the following steps:- Invokes
checkWritePermission(Object)
in order to ensure that this metadata is modifiable. - If
source
is null or empty, returnsnull
(meaning that the metadata property is not provided). - If
target
is null, creates a newMap
. - Copies the content of the given
source
into the target.
- Type Parameters:
K
- the type of keys represented by theClass
argument.V
- the type of values in the map.- Parameters:
source
- the source map, ornull
.target
- the target map, ornull
if not yet created.keyType
- the base type of keys to put in the map.- Returns:
- a map (possibly the
target
instance) containing thesource
entries, ornull
if the source was null. - Throws:
UnmodifiableMetadataException
- if this metadata is unmodifiable.- Since:
- 1.0
- See Also:
- Invokes
-
copyList
Creates a list with the content of thesource
collection, or returnsnull
if the source isnull
or empty. This is a convenience method for copying fields in subclass copy constructors.- Type Parameters:
E
- the type represented by theClass
argument.- Parameters:
source
- the source collection, ornull
.elementType
- the base type of elements to put in the list.- Returns:
- a list containing the
source
elements, ornull
if the source was null or empty.
-
copySet
Creates a set with the content of thesource
collection, or returnsnull
if the source isnull
or empty. This is a convenience method for copying fields in subclass copy constructors.- Type Parameters:
E
- the type represented by theClass
argument.- Parameters:
source
- the source collection, ornull
.elementType
- the base type of elements to put in the set.- Returns:
- a set containing the
source
elements, ornull
if 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 thesource
collection, or returnsnull
if the source isnull
or 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 theClass
argument.- Parameters:
source
- the source collection, ornull
.elementType
- the base type of elements to put in the collection.- Returns:
- a collection containing the
source
elements, ornull
if the source was null or empty.
-
copyMap
Creates a map with the content of thesource
map, or returnsnull
if the source isnull
or empty. This is a convenience method for copying fields in subclass copy constructors.- Type Parameters:
K
- the type of keys represented by theClass
argument.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
source
entries, ornull
if the source was null or empty. - Since:
- 1.0
-
singleton
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 theClass
argument.- Parameters:
value
- the singleton value to put in the returned collection, ornull
.elementType
- the element type (used only ifvalue
is non-null).- Returns:
- a new modifiable collection containing the given value,
or
null
if the given value was null.
-
nonNullList
Returns the specified list, or a new one ifcurrent
is null. This is a convenience method for implementation ofgetFoo()
methods.- Type Parameters:
E
- the type represented by theClass
argument.- Parameters:
current
- the existing list, ornull
if the list has not yet been created.elementType
- the element type (used only ifcurrent
is null).- Returns:
current
, or a new list ifcurrent
is null.
-
nonNullSet
Returns the specified set, or a new one ifcurrent
is null. This is a convenience method for implementation ofgetFoo()
methods.- Type Parameters:
E
- the type represented by theClass
argument.- Parameters:
current
- the existing set, ornull
if the set has not yet been created.elementType
- the element type (used only ifcurrent
is null).- Returns:
current
, or a new set ifcurrent
is null.
-
nonNullCollection
Returns the specified collection, or a new one ifcurrent
is null. This is a convenience method for implementation ofgetFoo()
methods.Choosing a collection type
Implementations shall invokenonNullList(…)
ornonNullSet(…)
instead of 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 aList
or aSet
should be used.- Type Parameters:
E
- the type represented by theClass
argument.- Parameters:
current
- the existing collection, ornull
if the collection has not yet been created.elementType
- the element type (used only ifcurrent
is null).- Returns:
current
, or a new collection ifcurrent
is null.
-
nonNullMap
Returns the specified map, or a new one ifcurrent
is null. This is a convenience method for implementation ofgetFoo()
methods.- Type Parameters:
K
- the type of keys represented by theClass
argument.V
- the type of values in the map.- Parameters:
current
- the existing map, ornull
if the map has not yet been created.keyType
- the key type (used only ifcurrent
is null).- Returns:
current
, or a new map ifcurrent
is null.- Since:
- 1.0
-
collectionType
Returns the type of collection to use for the given type. The current implementation can return only two values:Set.class
if the property should not accept duplicated values, orList.class
otherwise. Future SIS versions may accept other types.The default implementation returns
Set.class
if the element type is assignable toCodeList
,Enum
,String
,Charset
,Locale
orCurrency
, andList.class
otherwise. Subclasses can override this method for choosing different kind of collections. Note however thatSet
should 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.class
orSet.class
depending on whether the property shall accept duplicated values or not.
-