Class IdentifiedObjectSet<T extends org.opengis.referencing.IdentifiedObject>
- Type Parameters:
T- the type of objects to be included in this set.
- All Implemented Interfaces:
Iterable<T>,Collection<T>,Set<T>,CheckedContainer<T>,Localized
- Direct Known Subclasses:
CoordinateOperationSet
IdentifiedObject instances created from their authority codes only when first needed.
This set delegates IdentifiedObject creation to the most appropriate createFoo(String) method
of the AuthorityFactory given at construction time.
Elements can be added to this collection with calls to addAuthorityCode(String) for deferred
object creation, or to add(IdentifiedObject) for objects
that are already instantiated. This collection cannot contain two IdentifiedObject instances
having the same identifier. However, the identifiers used by this class can be controlled by overriding
getAuthorityCode(IdentifiedObject).
Iterations over elements in this collection preserve insertion order.
Purpose
IdentifiedObjectSet can be used as the set returned by implementations of the
GeodeticAuthorityFactory.createFromCoordinateReferenceSystemCodes(String, String) method.
Deferred creation can have great performance impact since some set may contain as much as 40 entries
(e.g. transformations from "ED50" (EPSG:4230) to "WGS 84" (EPSG:4326))
while some users only want to look for the first entry.
Exception handling
If the underlying factory failed to creates an object because of an unsupported operation method (NoSuchIdentifierException), the exception is logged at Level.WARNING and the iteration continue.
If the operation creation failed for any other kind of reason (FactoryException), then the exception is
re-thrown as an unchecked BackingStoreException. This default behavior can be changed by overriding
the isRecoverableFailure(FactoryException) method.
Thread safety
This class is thread-safe is the underlying factory is also thread-safe. However, implementers are encouraged to wrap in unmodifiable set if they intent to cacheIdentifiedObjectSet instances.- Since:
- 0.7
- Version:
- 0.7
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate String[]Theobjectskeys, created for iteration purpose when first needed and cleared when the map is modified.protected final org.opengis.referencing.AuthorityFactoryThe factory to use for creatingIdentifiedObjects when first needed.The map of object codes (keys), and the actual identified objects (values) when they have been created.private final AuthorityFactoryProxy<? super T>The type of objects included in this set. -
Constructor Summary
ConstructorsConstructorDescriptionIdentifiedObjectSet(org.opengis.referencing.AuthorityFactory factory, Class<T> type) Creates an initially empty set. -
Method Summary
Modifier and TypeMethodDescriptionbooleanEnsures that this collection contains the specified object.voidaddAuthorityCode(String code) Ensures that this collection contains an object for the specified authority code.voidclear()Removes all of the elements from this collection.(package private) final String[]codes()Returns thecodesarray, creating it if needed.booleanReturnstrueif this collection contains the specifiedIdentifiedObject.protected TcreateObject(String code) Creates an object for the specified authority code.(package private) final TReturns the identified object for the specified value, creating it if needed.protected StringgetAuthorityCode(T object) Returns the identifier for the specified object.String[]Returns the authority codes of allIdentifiedObjects contained in this collection, in insertion order.private static StringReturns the message to format below the logging for giving the cause of an error.Returns the type ofIdentifiedObjectincluded in this set.Returns the locale to use for error messages and warnings.protected booleanisRecoverableFailure(org.opengis.util.FactoryException exception) Returnstrueif the specified exception should be handled as a recoverable failure.iterator()Returns an iterator over the objects in this set.booleanRemoves the specifiedIdentifiedObjectfrom this collection, if it is present.booleanremoveAll(Collection<?> collection) Removes from this collection all of its elements that are contained in the specified collection.(package private) final voidremoveAuthorityCode(String code) Removes the object for the given code.voidresolve(int n) Ensures that the n first objects in this set are created.voidsetAuthorityCodes(String... codes) Sets the content of this collection to the object identified by the given codes.intsize()Returns the number of objects available in this set.Methods inherited from class java.util.AbstractSet
equals, hashCodeMethods inherited from class java.util.AbstractCollection
addAll, containsAll, isEmpty, retainAll, toArray, toArray, toStringMethods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, waitMethods inherited from interface java.util.Collection
parallelStream, removeIf, streamMethods inherited from interface java.util.Set
addAll, containsAll, isEmpty, retainAll, spliterator, toArray, toArray
-
Field Details
-
objects
The map of object codes (keys), and the actual identified objects (values) when they have been created. Each entry has a null value until the corresponding object is created.Note: using
ConcurrentHahMapwould be more efficient. But the latter does not support null values and does not preserve insertion order. -
codes
Theobjectskeys, created for iteration purpose when first needed and cleared when the map is modified. We need to use such array as a snapshot of the map state at the time the iterator was created because the map may be modified during iteration or by concurrent threads. -
factory
protected final org.opengis.referencing.AuthorityFactory factoryThe factory to use for creatingIdentifiedObjects when first needed. This is the authority factory given at construction time. -
proxy
private final AuthorityFactoryProxy<? super T extends org.opengis.referencing.IdentifiedObject> proxy -
type
The type of objects included in this set.- See Also:
-
-
Constructor Details
-
IdentifiedObjectSet
Creates an initially empty set. The set can be populated after construction by calls toaddAuthorityCode(String)for deferredIdentifiedObjectcreation, or toadd(IdentifiedObject)for already instantiated objects.- Parameters:
factory- the factory to use for deferredIdentifiedObjectinstances creation.type- the type of objects included in this set.
-
-
Method Details
-
getLocale
Returns the locale to use for error messages and warnings. The default implementation inherits thefactorylocale, if any. -
getElementType
Returns the type ofIdentifiedObjectincluded in this set.- Specified by:
getElementTypein interfaceCheckedContainer<T extends org.opengis.referencing.IdentifiedObject>- Returns:
- the type of
IdentifiedObjectincluded in this set.
-
clear
public void clear()Removes all of the elements from this collection.- Specified by:
clearin interfaceCollection<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
clearin interfaceSet<T extends org.opengis.referencing.IdentifiedObject>- Overrides:
clearin classAbstractCollection<T extends org.opengis.referencing.IdentifiedObject>
-
size
public int size()Returns the number of objects available in this set. Note that this number may decrease during the iteration process if the creation of someIdentifiedObjects failed.- Specified by:
sizein interfaceCollection<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
sizein interfaceSet<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
sizein classAbstractCollection<T extends org.opengis.referencing.IdentifiedObject>- Returns:
- the number of objects available in this set.
-
getAuthorityCodes
Returns the authority codes of allIdentifiedObjects contained in this collection, in insertion order. This method does not trig the creation of any object.- Returns:
- the authority codes in iteration order.
-
codes
Returns thecodesarray, creating it if needed. This method does not clone the array. -
setAuthorityCodes
Sets the content of this collection to the object identified by the given codes. For any code in the given sequence, this method will preserve the correspondingIdentifiedObjectinstance if it was already created. Otherwise objects will be created only when first needed.Purpose: this method is typically used together withgetAuthorityCodes()for altering the iteration order on the basis of authority codes. If the specifiedcodessequence contains the same elements than the ones in the array returned bygetAuthorityCodes()but in a different order, then this method just sets the new ordering.- Parameters:
codes- the authority codes of identified objects to store in this set.- See Also:
-
addAuthorityCode
Ensures that this collection contains an object for the specified authority code. If this collection does not contain any element for the given code, then this method will instantiate anIdentifiedObjectfor the given code only when first needed. Otherwise this collection is unchanged.- Parameters:
code- the code authority code of theIdentifiedObjectto include in this set.
-
add
Ensures that this collection contains the specified object. This collection does not allow multiple objects for the same authority code. If this collection already contains an object using the same authority code than the given object, then the old object is replaced by the new one regardless of whether the objects themselves are equal or not.- Specified by:
addin interfaceCollection<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
addin interfaceSet<T extends org.opengis.referencing.IdentifiedObject>- Overrides:
addin classAbstractCollection<T extends org.opengis.referencing.IdentifiedObject>- Parameters:
object- the object to add to the set.- Returns:
trueif this set changed as a result of this call.- See Also:
-
get
Returns the identified object for the specified value, creating it if needed.- Throws:
BackingStoreException- if the object creation failed.- See Also:
-
contains
Returnstrueif this collection contains the specifiedIdentifiedObject.- Specified by:
containsin interfaceCollection<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
containsin interfaceSet<T extends org.opengis.referencing.IdentifiedObject>- Overrides:
containsin classAbstractCollection<T extends org.opengis.referencing.IdentifiedObject>- Parameters:
object- theIdentifiedObjectto test for presence in this set.- Returns:
trueif the given object is presents in this set.
-
removeAuthorityCode
Removes the object for the given code.- Parameters:
code- the code of the object to remove.
-
remove
Removes the specifiedIdentifiedObjectfrom this collection, if it is present.- Specified by:
removein interfaceCollection<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
removein interfaceSet<T extends org.opengis.referencing.IdentifiedObject>- Overrides:
removein classAbstractCollection<T extends org.opengis.referencing.IdentifiedObject>- Parameters:
object- theIdentifiedObjectto remove from this set.- Returns:
trueif this set changed as a result of this call.
-
removeAll
Removes from this collection all of its elements that are contained in the specified collection.- Specified by:
removeAllin interfaceCollection<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
removeAllin interfaceSet<T extends org.opengis.referencing.IdentifiedObject>- Overrides:
removeAllin classAbstractSet<T extends org.opengis.referencing.IdentifiedObject>- Parameters:
collection- theIdentifiedObjects to remove from this set.- Returns:
trueif this set changed as a result of this call.
-
iterator
Returns an iterator over the objects in this set. If the iteration encounter any kind ofFactoryExceptionother thanNoSuchIdentifierException, then the exception will be re-thrown as an uncheckedBackingStoreException.This iterator is not thread safe – iteration should be done in a single thread. However, the iterator is robust to concurrent changes in
IdentifiedObjectSetduring iteration.- Specified by:
iteratorin interfaceCollection<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
iteratorin interfaceIterable<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
iteratorin interfaceSet<T extends org.opengis.referencing.IdentifiedObject>- Specified by:
iteratorin classAbstractCollection<T extends org.opengis.referencing.IdentifiedObject>- Returns:
- an iterator over all
IdentifiedObjectinstances in this set, in insertion order. - Throws:
BackingStoreException- if an error occurred while creating the iterator.
-
resolve
public void resolve(int n) throws org.opengis.util.FactoryException Ensures that the n first objects in this set are created. This method can be invoked for making sure that the underlying factory is really capable to create at least one object.FactoryException(except the ones accepted as recoverable failures) are thrown as if they were never wrapped intoBackingStoreException.- Parameters:
n- the number of object to resolve. If this number is equal or greater thansize(), then this method ensures that allIdentifiedObjectinstances in this collection are created.- Throws:
org.opengis.util.FactoryException- if an object creation failed.
-
getAuthorityCode
Returns the identifier for the specified object. The default implementation takes the first of the following identifier which is found:- An identifier allocated by the authority given by
factory.getAuthority(). - The first object identifier, regardless its authority.
- The first object name, regardless its authority.
- Parameters:
object- the object for which to get the authority code.- Returns:
- the authority code of the given identified object.
- An identifier allocated by the authority given by
-
createObject
Creates an object for the specified authority code. This method is invoked during the iteration process if an object was not already created.- Parameters:
code- the code for which to create the identified object.- Returns:
- the identified object created from the given code.
- Throws:
org.opengis.util.FactoryException- if the object creation failed.
-
isRecoverableFailure
protected boolean isRecoverableFailure(org.opengis.util.FactoryException exception) Returnstrueif the specified exception should be handled as a recoverable failure. This method is invoked during the iteration process if the factory failed to create some objects. If this method returnstruefor the given exception, then the exception will be logged atLevel.WARNING. If this method returnsfalse, then the exception will be re-thrown as aBackingStoreException.The default implementation applies the following rules:
- If
NoSuchAuthorityCodeException, returnsfalsesince failure to find a code declared in the collection would be an inconsistency. Note that this exception is a subtype ofNoSuchIdentifierException, so it must be tested before the last case below. - If
NoSuchIdentifierException, returnstruesince this exception is caused by an attempt to create a parameterized transform for an unimplemented operation. - If
MissingFactoryResourceException, returnstrue. - Otherwise returns
false.
- Parameters:
exception- the exception that occurred while creating an object.- Returns:
trueif the given exception should be considered recoverable, orfalseif it should be considered fatal.
- If
-
getCause
Returns the message to format below the logging for giving the cause of an error.
-