An authority factory that caches all objects created by delegate factories.
This class is set up to cache the full complement of referencing objects:
In many cases a single implementation will be used for several the authority factory
interfaces - but this is not a requirement.
The behaviour of the createFoo(String) methods first looks if a
previously created object exists for the given code. If such an object
exists, it is returned directly. The testing of the cache is synchronized and
may block if the referencing object is under construction.

If the object is not yet created, the definition is delegated to the
appropriate the AuthorityFactory authority factory and the
result is cached for next time.

This object is responsible for owning a {{ReferencingObjectCache}}; there are
several implementations to choose from on construction.

CachedAuthorityDecorator

Constructs an instance wrapping the specified factory. The
maxStrongReferences argument specify the maximum number of
objects to keep by strong reference. If a greater amount of objects are
created, then the strong references for the oldest ones are replaced by
weak references.

toKey

createObject

Returns an arbitrary object from a code. The returned object will typically be an instance
of Datum, CoordinateSystem, CoordinateReferenceSystem or
CoordinateOperation. The default implementation always throw an exception.
Subclasses should override this method if they are capable to automatically detect
the object type from its code.

createFromCoordinateReferenceSystemCodes

Creates an operation from coordinate reference system codes. The default implementation
returns an empty set. We do not delegate to some kind
of coordinate operation factory method because the usual contract
for this method is to extract the information from an authority database like
EPSG, not to compute operations on-the-fly.

Rational: Coordinate operation factory
backed by an authority
will invoke this method. If this method invoked the coordinate operation factory in turn, the
application could be trapped in infinite recursive calls.

getIdentifiedObjectFinder

Returns a finder which can be used for looking up unidentified objects. The finder
fetchs a fully identified object from an incomplete one,
for example from an object without identifier or "AUTHORITY[...]" element in
Well Known Text terminology.

type - The type of objects to look for. Should be a GeoAPI interface like
GeographicCRS.class, but this method accepts also implementation
class. If the type is unknown, use IdentifiedObject.class. A more
accurate type may help to speed up the search, since it reduces the amount
of tables to scan in some implementations like the factories backed by
EPSG database.

dispose

Releases resources immediately instead of waiting for the garbage collector.
Once a factory has been disposed, further create(...) invocations
may throw a FactoryException. Disposing a previously-disposed factory,
however, has no effect.