/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2005-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* This package contains documentation from OpenGIS specifications.
* OpenGIS consortium's work is fully acknowledged here.
*/
package org.geotools.referencing.factory;
import java.util.Set;
import java.util.Collections;
import javax.measure.unit.Unit;
import org.opengis.referencing.*;
import org.opengis.referencing.cs.*;
import org.opengis.referencing.crs.*;
import org.opengis.referencing.datum.*;
import org.opengis.referencing.operation.*;
import org.opengis.util.InternationalString;
import org.opengis.metadata.extent.Extent;
import org.opengis.metadata.citation.Citation;
import org.opengis.parameter.ParameterDescriptor;
import org.opengis.util.GenericName;
import org.geotools.metadata.iso.citation.Citations;
import org.geotools.resources.i18n.ErrorKeys;
import org.geotools.resources.i18n.Errors;
import org.geotools.util.NameFactory;
/**
* Base class for authority factories. An <cite>authority</cite> is an organization that maintains
* definitions of authority codes. An <cite>authority code</cite> is a compact string defined by
* an authority to reference a particular spatial reference object. For example the
* <A HREF="http://www.epsg.org">European Petroleum Survey Group (EPSG)</A> maintains
* a database of coordinate systems, and other spatial referencing objects, where each
* object has a code number ID. For example, the EPSG code for a WGS84 Lat/Lon coordinate
* system is {@code "4326"}.
* <p>
* This class defines a default implementation for most methods defined in the
* {@link DatumAuthorityFactory}, {@link CSAuthorityFactory} and {@link CRSAuthorityFactory}
* interfaces. However, those interfaces do not appear in the {@code implements} clause of
* this class declaration. This is up to subclasses to decide which interfaces they declare
* to implement.
* <p>
* The default implementation for all {@code createFoo} methods ultimately invokes
* {@link #createObject}, which may be the only method that a subclass need to override.
* However, other methods may be overridden as well for better performances.
*
* @since 2.1
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux (IRD)
*/
public abstract class AbstractAuthorityFactory extends ReferencingFactory
implements AuthorityFactory
{
/**
* Constructs an instance using the specified priority level.
*
* @param priority The priority for this factory, as a number between
* {@link #MINIMUM_PRIORITY MINIMUM_PRIORITY} and
* {@link #MAXIMUM_PRIORITY MAXIMUM_PRIORITY} inclusive.
*/
protected AbstractAuthorityFactory(final int priority) {
super(priority);
}
/**
* Returns {@code true} if this factory is available. This method may returns {@code false}
* for example if a connection to the EPSG database failed. This method is defined here for
* implementation convenience, but not yet public because not yet applicable. It will be made
* public in {@link DeferredAuthorityFactory} and {@link AuthorityFactoryAdapter} subclasses,
* which implement the {@link org.geotools.factory.OptionalFactory} interface.
*/
boolean isAvailable() {
return true;
}
/**
* If this factory is a wrapper for the specified factory that do not add any additional
* {@linkplain #getAuthorityCodes authority codes}, returns {@code true}. Example of such
* wrappers are {@link BufferedAuthorityFactory} and {@link TransformedAuthorityFactory}.
* <p>
* This method should perform a cheap test. It is for {@link FallbackAuthorityFactory}
* internal use only and should not be public.
*/
boolean sameAuthorityCodes(final AuthorityFactory factory) {
return factory == this;
}
/**
* Returns the organization or party responsible for definition and maintenance of the
* database.
*/
public abstract Citation getAuthority();
/**
* Returns a description of the underlying backing store, or {@code null} if unknown.
* This is for example the database software used for storing the data.
* The default implementation returns always {@code null}.
*
* @return The description of the underlying backing store, or {@code null}.
* @throws FactoryException if a failure occurs while fetching the engine description.
*/
public String getBackingStoreDescription() throws FactoryException {
return null;
}
/**
* Returns an arbitrary object from a code. The returned object will typically be an instance
* of {@link Datum}, {@link CoordinateSystem}, {@link CoordinateReferenceSystem} or
* {@link 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.
*
* @param code Value allocated by authority.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createCoordinateReferenceSystem
* @see #createDatum
* @see #createEllipsoid
* @see #createUnit
*/
public IdentifiedObject createObject(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
ensureNonNull("code", code);
throw noSuchAuthorityCode(IdentifiedObject.class, code);
}
/**
* Returns an arbitrary {@linkplain Datum datum} from a code.
* The default implementation invokes <code>{@linkplain #createObject createObject}(code)</code>.
*
* @param code Value allocated by authority.
* @return The datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createGeodeticDatum
* @see #createVerticalDatum
* @see #createTemporalDatum
*/
public Datum createDatum(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject object = createObject(code);
try {
return (Datum) object;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(Datum.class, code, exception);
}
}
/**
* Creates a {@linkplain EngineeringDatum engineering datum} from a code.
* The default implementation invokes <code>{@linkplain #createDatum createDatum}(code)</code>.
*
* @param code Value allocated by authority.
* @return The datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createEngineeringCRS
*/
public EngineeringDatum createEngineeringDatum(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final Datum datum = createDatum(code);
try {
return (EngineeringDatum) datum;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(EngineeringDatum.class, code, exception);
}
}
/**
* Creates a {@linkplain ImageDatum image datum} from a code.
* The default implementation invokes <code>{@linkplain #createDatum createDatum}(code)</code>.
*
* @param code Value allocated by authority.
* @return The datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createImageCRS
*/
public ImageDatum createImageDatum(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final Datum datum = createDatum(code);
try {
return (ImageDatum) datum;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(ImageDatum.class, code, exception);
}
}
/**
* Creates a {@linkplain VerticalDatum vertical datum} from a code.
* The default implementation invokes <code>{@linkplain #createDatum createDatum}(code)</code>.
*
* @param code Value allocated by authority.
* @return The datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createVerticalCRS
*/
public VerticalDatum createVerticalDatum(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final Datum datum = createDatum(code);
try {
return (VerticalDatum) datum;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(VerticalDatum.class, code, exception);
}
}
/**
* Creates a {@linkplain TemporalDatum temporal datum} from a code.
* The default implementation invokes <code>{@linkplain #createDatum createDatum}(code)</code>.
*
* @param code Value allocated by authority.
* @return The datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createTemporalCRS
*/
public TemporalDatum createTemporalDatum(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final Datum datum = createDatum(code);
try {
return (TemporalDatum) datum;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(TemporalDatum.class, code, exception);
}
}
/**
* Returns a {@linkplain GeodeticDatum geodetic datum} from a code.
* The default implementation invokes <code>{@linkplain #createDatum createDatum}(code)</code>.
*
* @param code Value allocated by authority.
* @return The datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createEllipsoid
* @see #createPrimeMeridian
* @see #createGeographicCRS
* @see #createProjectedCRS
*/
public GeodeticDatum createGeodeticDatum(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final Datum datum = createDatum(code);
try {
return (GeodeticDatum) datum;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(GeodeticDatum.class, code, exception);
}
}
/**
* Returns an {@linkplain Ellipsoid ellipsoid} from a code.
* The default implementation invokes <code>{@linkplain #createObject createObject}(code)</code>.
*
* @param code Value allocated by authority.
* @return The ellipsoid for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createGeodeticDatum
*/
public Ellipsoid createEllipsoid(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject object = createObject(code);
try {
return (Ellipsoid) object;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(Ellipsoid.class, code, exception);
}
}
/**
* Returns a {@linkplain PrimeMeridian prime meridian} from a code.
* The default implementation invokes <code>{@linkplain #createObject createObject}(code)</code>.
*
* @param code Value allocated by authority.
* @return The prime meridian for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createGeodeticDatum
*/
public PrimeMeridian createPrimeMeridian(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject object = createObject(code);
try {
return (PrimeMeridian) object;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(PrimeMeridian.class, code, exception);
}
}
/**
* Returns a {@linkplain Extent extent} (usually an area of validity) from a code.
* The default implementation invokes <code>{@linkplain #createObject createObject}(code)</code>.
*
* @param code Value allocated by authority.
* @return The extent for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public Extent createExtent(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject object = createObject(code);
try {
return (Extent) object;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(Extent.class, code, exception);
}
}
/**
* Returns an arbitrary {@linkplain CoordinateSystem coordinate system} from a code.
* The default implementation invokes <code>{@linkplain #createObject createObject}(code)</code>.
*
* @param code Value allocated by authority.
* @return The coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public CoordinateSystem createCoordinateSystem(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject object = createObject(code);
try {
return (CoordinateSystem) object;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(CoordinateSystem.class, code, exception);
}
}
/**
* Creates a cartesian coordinate system from a code.
* The default implementation invokes
* <code>{@linkplain #createCoordinateSystem createCoordinateSystem}(code)</code>.
*
* @param code Value allocated by authority.
* @return The coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public CartesianCS createCartesianCS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateSystem cs = createCoordinateSystem(code);
try {
return (CartesianCS) cs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(CartesianCS.class, code, exception);
}
}
/**
* Creates a polar coordinate system from a code.
* The default implementation invokes
* <code>{@linkplain #createCoordinateSystem createCoordinateSystem}(code)</code>.
*
* @param code Value allocated by authority.
* @return The coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public PolarCS createPolarCS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateSystem cs = createCoordinateSystem(code);
try {
return (PolarCS) cs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(PolarCS.class, code, exception);
}
}
/**
* Creates a cylindrical coordinate system from a code.
* The default implementation invokes
* <code>{@linkplain #createCoordinateSystem createCoordinateSystem}(code)</code>.
*
* @param code Value allocated by authority.
* @return The coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public CylindricalCS createCylindricalCS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateSystem cs = createCoordinateSystem(code);
try {
return (CylindricalCS) cs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(CylindricalCS.class, code, exception);
}
}
/**
* Creates a spherical coordinate system from a code.
* The default implementation invokes
* <code>{@linkplain #createCoordinateSystem createCoordinateSystem}(code)</code>.
*
* @param code Value allocated by authority.
* @return The coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public SphericalCS createSphericalCS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateSystem cs = createCoordinateSystem(code);
try {
return (SphericalCS) cs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(SphericalCS.class, code, exception);
}
}
/**
* Creates an ellipsoidal coordinate system from a code.
* The default implementation invokes
* <code>{@linkplain #createCoordinateSystem createCoordinateSystem}(code)</code>.
*
* @param code Value allocated by authority.
* @return The coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public EllipsoidalCS createEllipsoidalCS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateSystem cs = createCoordinateSystem(code);
try {
return (EllipsoidalCS) cs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(EllipsoidalCS.class, code, exception);
}
}
/**
* Creates a vertical coordinate system from a code.
* The default implementation invokes
* <code>{@linkplain #createCoordinateSystem createCoordinateSystem}(code)</code>.
*
* @param code Value allocated by authority.
* @return The coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public VerticalCS createVerticalCS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateSystem cs = createCoordinateSystem(code);
try {
return (VerticalCS) cs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(VerticalCS.class, code, exception);
}
}
/**
* Creates a temporal coordinate system from a code.
* The default implementation invokes
* <code>{@linkplain #createCoordinateSystem createCoordinateSystem}(code)</code>.
*
* @param code Value allocated by authority.
* @return The coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public TimeCS createTimeCS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateSystem cs = createCoordinateSystem(code);
try {
return (TimeCS) cs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(TimeCS.class, code, exception);
}
}
/**
* Returns a {@linkplain CoordinateSystemAxis coordinate system axis} from a code.
* The default implementation invokes <code>{@linkplain #createObject createObject}(code)</code>.
*
* @param code Value allocated by authority.
* @return The axis for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public CoordinateSystemAxis createCoordinateSystemAxis(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject object = createObject(code);
try {
return (CoordinateSystemAxis) object;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(CoordinateSystemAxis.class, code, exception);
}
}
/**
* Returns an {@linkplain Unit unit} from a code.
* The default implementation invokes <code>{@linkplain #createObject createObject}(code)</code>.
*
* @param code Value allocated by authority.
* @return The unit for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public Unit<?> createUnit(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject object = createObject(code);
try {
return (Unit) object;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(Unit.class, code, exception);
}
}
/**
* Returns an arbitrary {@linkplain CoordinateReferenceSystem coordinate reference system}
* from a code. If the coordinate reference system type is know at compile time, it is
* recommended to invoke the most precise method instead of this one (for example
* <code> {@linkplain #createGeographicCRS createGeographicCRS}(code) </code>
* instead of <code> createCoordinateReferenceSystem(code) </code> if the caller
* know he is asking for a {@linkplain GeographicCRS geographic coordinate reference system}).
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createGeographicCRS
* @see #createProjectedCRS
* @see #createVerticalCRS
* @see #createTemporalCRS
* @see #createCompoundCRS
*/
public CoordinateReferenceSystem createCoordinateReferenceSystem(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject object = createObject(code);
try {
return (CoordinateReferenceSystem) object;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(CoordinateReferenceSystem.class, code, exception);
}
}
/**
* Creates a 3D coordinate reference system from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public CompoundCRS createCompoundCRS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateReferenceSystem crs = createCoordinateReferenceSystem(code);
try {
return (CompoundCRS) crs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(CompoundCRS.class, code, exception);
}
}
/**
* Creates a derived coordinate reference system from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public DerivedCRS createDerivedCRS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateReferenceSystem crs = createCoordinateReferenceSystem(code);
try {
return (DerivedCRS) crs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(DerivedCRS.class, code, exception);
}
}
/**
* Creates a {@linkplain EngineeringCRS engineering coordinate reference system} from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public EngineeringCRS createEngineeringCRS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateReferenceSystem crs = createCoordinateReferenceSystem(code);
try {
return (EngineeringCRS) crs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(EngineeringCRS.class, code, exception);
}
}
/**
* Returns a {@linkplain GeographicCRS geographic coordinate reference system} from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createGeodeticDatum
*/
public GeographicCRS createGeographicCRS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateReferenceSystem crs = createCoordinateReferenceSystem(code);
try {
return (GeographicCRS) crs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(GeographicCRS.class, code, exception);
}
}
/**
* Returns a {@linkplain GeocentricCRS geocentric coordinate reference system} from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed.
*
* @see #createGeodeticDatum
*/
public GeocentricCRS createGeocentricCRS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateReferenceSystem crs = createCoordinateReferenceSystem(code);
try {
return (GeocentricCRS) crs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(GeocentricCRS.class, code, exception);
}
}
/**
* Creates a {@linkplain ImageCRS image coordinate reference system} from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public ImageCRS createImageCRS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateReferenceSystem crs = createCoordinateReferenceSystem(code);
try {
return (ImageCRS) crs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(ImageCRS.class, code, exception);
}
}
/**
* Returns a {@linkplain ProjectedCRS projected coordinate reference system} from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createGeodeticDatum
*/
public ProjectedCRS createProjectedCRS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateReferenceSystem crs = createCoordinateReferenceSystem(code);
try {
return (ProjectedCRS) crs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(ProjectedCRS.class, code, exception);
}
}
/**
* Creates a {@linkplain TemporalCRS temporal coordinate reference system} from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createTemporalDatum
*/
public TemporalCRS createTemporalCRS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateReferenceSystem crs = createCoordinateReferenceSystem(code);
try {
return (TemporalCRS) crs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(TemporalCRS.class, code, exception);
}
}
/**
* Creates a {@linkplain VerticalCRS vertical coordinate reference system} from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createVerticalDatum
*/
public VerticalCRS createVerticalCRS(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final CoordinateReferenceSystem crs = createCoordinateReferenceSystem(code);
try {
return (VerticalCRS) crs;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(VerticalCRS.class, code, exception);
}
}
/**
* Creates a parameter descriptor from a code.
*
* @param code Value allocated by authority.
* @return The coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @since 2.2
*/
public ParameterDescriptor createParameterDescriptor(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject operation = createObject(code);
try {
return (ParameterDescriptor) operation;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(ParameterDescriptor.class, code, exception);
}
}
/**
* Creates an operation method from a code.
*
* @param code Value allocated by authority.
* @return The operation method for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @since 2.2
*/
public OperationMethod createOperationMethod(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject operation = createObject(code);
try {
return (OperationMethod) operation;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(OperationMethod.class, code, exception);
}
}
/**
* Creates an operation from a single operation code.
*
* @param code Value allocated by authority.
* @return The operation for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @since 2.2
*/
public CoordinateOperation createCoordinateOperation(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
final IdentifiedObject operation = createObject(code);
try {
return (CoordinateOperation) operation;
} catch (ClassCastException exception) {
throw noSuchAuthorityCode(CoordinateOperation.class, code, exception);
}
}
/**
* Creates an operation from coordinate reference system codes. The default implementation
* returns an {@linkplain Collections#EMPTY_SET empty set}. We do not delegate to some kind
* of {@linkplain CoordinateOperationFactory#createOperation(CoordinateReferenceSystem,
* CoordinateReferenceSystem) coordinate operation factory method} because the usual contract
* for this method is to extract the information from an authority database like
* <A HREF="http://www.epsg.org">EPSG</A>, not to compute operations on-the-fly.
* <p>
* <strong>Rational:</strong> Coordinate operation factory
* {@linkplain org.geotools.referencing.operation.AuthorityBackedFactory 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.
*
* @param sourceCRS Coded value of source coordinate reference system.
* @param targetCRS Coded value of target coordinate reference system.
* @return The operations from {@code sourceCRS} to {@code targetCRS}.
* @throws NoSuchAuthorityCodeException if a specified code was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @since 2.2
*/
public Set<CoordinateOperation> createFromCoordinateReferenceSystemCodes(String sourceCRS, String targetCRS)
throws NoSuchAuthorityCodeException, FactoryException
{
return Collections.emptySet();
}
/**
* Returns a finder which can be used for looking up unidentified objects. The finder
* fetchs a fully {@linkplain IdentifiedObject identified object} from an incomplete one,
* for example from an object without identifier or "{@code AUTHORITY[...]}" element in
* <cite>Well Known Text</cite> terminology.
*
* @param type The type of objects to look for. Should be a GeoAPI interface like
* {@code GeographicCRS.class}, but this method accepts also implementation
* class. If the type is unknown, use {@code 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.
* @return A finder to use for looking up unidentified objects.
* @throws FactoryException if the finder can not be created.
*
* @since 2.4
*/
public IdentifiedObjectFinder getIdentifiedObjectFinder(Class<? extends IdentifiedObject> type)
throws FactoryException
{
return new IdentifiedObjectFinder(this, type);
}
/**
* Releases resources immediately instead of waiting for the garbage collector.
* Once a factory has been disposed, further {@code create(...)} invocations
* may throw a {@link FactoryException}. Disposing a previously-disposed factory,
* however, has no effect.
*
* @throws FactoryException if an error occured while disposing the factory.
*/
public void dispose() throws FactoryException {
// To be overridden by subclasses.
}
/**
* Creates an exception for an unknow authority code. This convenience method is provided
* for implementation of {@code createXXX} methods.
*
* @param type The GeoAPI interface that was to be created
* (e.g. {@code CoordinateReferenceSystem.class}).
* @param code The unknow authority code.
* @param cause The cause of this error, or {@code null}.
* @return An exception initialized with an error message built
* from the specified informations.
*/
private NoSuchAuthorityCodeException noSuchAuthorityCode(final Class type,
final String code,
final ClassCastException cause)
{
final NoSuchAuthorityCodeException exception = noSuchAuthorityCode(type, code);
exception.initCause(cause);
return exception;
}
/**
* Trims the authority scope, if present. For example if this factory is an EPSG authority
* factory and the specified code start with the "EPSG:" prefix, then the prefix is removed.
* Otherwise, the string is returned unchanged (except for leading and trailing spaces).
*
* @param code The code to trim.
* @return The code without the authority scope.
*/
protected String trimAuthority(String code) {
/*
* IMPLEMENTATION NOTE: This method is overrided in PropertyAuthorityFactory. If
* implementation below is modified, it is probably worth to revisit the overrided
* method as well.
*/
code = code.trim();
final GenericName name = NameFactory.create(code);
final GenericName scope = name.scope().name();
if (scope == null) {
return code;
}
if (Citations.identifierMatches(getAuthority(), scope.toString())) {
return name.tip().toString().trim();
}
return code;
}
/**
* Creates an exception for an unknow authority code. This convenience method is provided
* for implementation of {@code createXXX} methods.
*
* @param type The GeoAPI interface that was to be created
* (e.g. {@code CoordinateReferenceSystem.class}).
* @param code The unknow authority code.
* @return An exception initialized with an error message built
* from the specified informations.
*/
protected final NoSuchAuthorityCodeException noSuchAuthorityCode(final Class type,
final String code)
{
final InternationalString authority = getAuthority().getTitle();
return new NoSuchAuthorityCodeException(Errors.format(ErrorKeys.NO_SUCH_AUTHORITY_CODE_$3,
code, authority, type), authority.toString(), code);
}
}