Package org.geotools.metadata
Class ModifiableMetadata
- Object
-
- AbstractMetadata
-
- ModifiableMetadata
-
- All Implemented Interfaces:
Cloneable
- Direct Known Subclasses:
MetadataEntity
public abstract class ModifiableMetadata extends AbstractMetadata implements Cloneable
Base class for metadata that may (or may not) be modifiable. Implementations will typically provideset*(...)
methods for each correspondingget*()
method. An initially modifiable metadata may become unmodifiable at a later stage (typically after its construction is completed) by the call to thefreeze()
method.Subclasses should follow the pattern below for every
get
andset
methods, with a special processing for collections:private Foo property; public Foo getProperty() { return property; } public synchronized void setProperty(Foo newValue) { checkWritePermission(); property = newValue; }
checkWritePermission()
is implicit):private Collection<Foo> properties; public synchronized Collection<Foo> getProperties() { return properties = nonNullCollection(properties, Foo.class); } public synchronized void setProperties(Collection<Foo> newValues) { properties = copyCollection(newValues, properties, Foo.class); }
- Since:
- 2.4
- Author:
- Martin Desruisseaux
-
-
Field Summary
-
Fields inherited from class AbstractMetadata
LOGGER
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
ModifiableMetadata()
Constructs an initially empty metadata.protected
ModifiableMetadata(Object source)
Constructs a metadata entity initialized with the values from the specified metadata.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
checkWritePermission()
Checks if changes in the metadata are allowed.protected ModifiableMetadata
clone()
Returns a shallow copy of this metadata.protected <E> Collection<E>
copyCollection(Collection<? extends E> source, Collection<E> target, Class<E> elementType)
Copies the content of one collection (source
) into an other (target
).protected <E> List<E>
copyList(Collection<? extends E> source, List<E> target, Class<E> elementType)
Copies the content of one list (source
) into an other (target
).void
freeze()
Declares this metadata and all its attributes as unmodifiable.boolean
isModifiable()
Returnstrue
if this metadata is modifiable.protected <E> Collection<E>
nonNullCollection(Collection<E> c, Class<E> elementType)
Returns the specified collection, or a new one ifc
is null.protected <E> List<E>
nonNullList(List<E> c, Class<E> elementType)
Returns the specified list, or a new one ifc
is null.protected <E> Set<E>
nonNullSet(Set<E> c, Class<E> elementType)
Returns the specified set, or a new one ifc
is null.AbstractMetadata
unmodifiable()
Returns an unmodifiable copy of this metadata.-
Methods inherited from class AbstractMetadata
asMap, asTree, equals, getInterface, getStandard, hashCode, toString
-
-
-
-
Constructor Detail
-
ModifiableMetadata
protected ModifiableMetadata()
Constructs an initially empty metadata.
-
ModifiableMetadata
protected ModifiableMetadata(Object source) throws ClassCastException, UnmodifiableMetadataException
Constructs a metadata entity initialized with the values from the specified metadata. This constructor behavior is as in superclass constructor.- Parameters:
source
- The metadata to copy values from.- Throws:
ClassCastException
- if the specified metadata don't implements the expected metadata interface.UnmodifiableMetadataException
- if this class don't defineset
methods corresponding to theget
methods found in the implemented interface, or if this instance is not modifiable for some other reason.
-
-
Method Detail
-
isModifiable
public final boolean isModifiable()
Returnstrue
if this metadata is modifiable. This method returnsfalse
iffreeze()
has been invoked on this object.- Returns:
true
if this metadata is modifiable.
-
unmodifiable
public AbstractMetadata unmodifiable()
Returns an unmodifiable copy of this metadata. Any attempt to modify an attribute of the returned object will throw anUnmodifiableMetadataException
. If this metadata is already unmodifiable, then this method returnsthis
.The default implementation clone this metadata and freeze the clone before to return it.
- Returns:
- An unmodifiable copy of this metadata.
-
freeze
public void freeze()
Declares this metadata and all its attributes as unmodifiable. This method is invoked automatically by theunmodifiable()
method. Subclasses usually don't need to override it since the default implementation performs its work using Java reflection.
-
checkWritePermission
protected void checkWritePermission() throws UnmodifiableMetadataException
Checks if changes in the metadata are allowed. AllsetFoo(...)
methods in subclasses should invoke this method (directly or indirectly) before to apply any change.- Throws:
UnmodifiableMetadataException
- if this metadata is unmodifiable.
-
copyList
protected final <E> List<E> copyList(Collection<? extends E> source, List<E> target, Class<E> elementType) throws UnmodifiableMetadataException
Copies the content of one list (source
) into an other (target
). If the target list isnull
, a new target list is created.A call to
checkWritePermission()
is implicit before the copy is performed.- Type Parameters:
E
- The type of elements in the list.- Parameters:
source
- The source list.null
is synonymous to empty.target
- The target list, ornull
if not yet created.elementType
- The base type of elements to put in the list.- Returns:
target
, or a newly created list.- Throws:
UnmodifiableMetadataException
- if this metadata is unmodifiable.- Since:
- 2.5
-
copyCollection
protected final <E> Collection<E> copyCollection(Collection<? extends E> source, Collection<E> target, Class<E> elementType) throws UnmodifiableMetadataException
Copies the content of one collection (source
) into an other (target
). If the target collection isnull
, or if its type (List
vsSet
) doesn't matches the type of the source collection, a new target collection is created.A call to
checkWritePermission()
is implicit before the copy is performed.- Type Parameters:
E
- The type of elements in the collection.- Parameters:
source
- The source collection.null
is synonymous to empty.target
- The target collection, ornull
if not yet created.elementType
- The base type of elements to put in the collection.- Returns:
target
, or a newly created collection.- Throws:
UnmodifiableMetadataException
- if this metadata is unmodifiable.
-
nonNullCollection
protected final <E> Collection<E> nonNullCollection(Collection<E> c, Class<E> elementType)
Returns the specified collection, or a new one ifc
is null. This is a convenience method for implementation ofgetFoo()
methods.- Type Parameters:
E
- The type of elements in the collection.- Parameters:
c
- The collection to checks.elementType
- The element type (used only ifc
is null).- Returns:
c
, or a new collection ifc
is null.
-
nonNullSet
protected final <E> Set<E> nonNullSet(Set<E> c, Class<E> elementType)
Returns the specified set, or a new one ifc
is null. This is a convenience method for implementation ofgetFoo()
methods.- Type Parameters:
E
- The type of elements in the set.- Parameters:
c
- The set to checks.elementType
- The element type (used only ifc
is null).- Returns:
c
, or a new set ifc
is null.- Since:
- 2.5
-
nonNullList
protected final <E> List<E> nonNullList(List<E> c, Class<E> elementType)
Returns the specified list, or a new one ifc
is null. This is a convenience method for implementation ofgetFoo()
methods.- Type Parameters:
E
- The type of elements in the list.- Parameters:
c
- The list to checks.elementType
- The element type (used only ifc
is null).- Returns:
c
, or a new list ifc
is null.
-
clone
protected ModifiableMetadata clone() throws CloneNotSupportedException
Returns a shallow copy of this metadata.While cloneable, this class do not provides the
clone()
operation as part of the public API. The clone operation is required for the internal working of theunmodifiable()
method, which expect fromclone()
a shallow copy of this metadata entity. The default implementation ofObject.clone()
is suffisient for most use.- Overrides:
clone
in classObject
- Returns:
- A shallow copy of this metadata.
- Throws:
CloneNotSupportedException
- if the clone is not supported.
-
-