/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2004-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. */ package org.geotools.referencing.factory.wms; // J2SE dependencies import java.util.Map; import java.util.TreeMap; import java.util.Iterator; import java.util.Collections; import java.util.Set; import java.util.LinkedHashSet; // OpenGIS dependencies import org.opengis.util.InternationalString; import org.opengis.metadata.citation.Citation; import org.opengis.referencing.FactoryException; import org.opengis.referencing.IdentifiedObject; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.crs.CRSAuthorityFactory; import org.opengis.referencing.crs.ProjectedCRS; // Geotools dependencies import org.geotools.factory.Hints; import org.geotools.util.SimpleInternationalString; import org.geotools.metadata.iso.citation.Citations; import org.geotools.metadata.iso.citation.CitationImpl; import org.geotools.referencing.factory.DirectAuthorityFactory; /** * The factory for {@linkplain ProjectedCRS projected CRS} in the {@code AUTO} and {@code AUTO2} * space. * * @since 2.2 * * @source $URL$ * @version $Id$ * @author Jody Garnett * @author Rueben Schulz * @author Martin Desruisseaux * * @deprecated This class will move in a <code>org.geotools.referencing.factory.<strong>web</strong></code> * package in a future Geotools version, in order to put together other web-related factories defined * outside the WMS specification. Don't use this class directly. You should not need to * anyway - use {@link org.geotools.referencing.ReferencingFactoryFinder} instead, which * will continue to work no matter where this class is located. */ public class AutoCRSFactory extends DirectAuthorityFactory implements CRSAuthorityFactory { /** * The authority code. We use {@code AUTO2} citation, but merge {@code AUTO} and * {@code AUTO2} identifiers in order to use the same factory for both authorities. */ private static final Citation AUTHORITY; static { final CitationImpl c = new CitationImpl(Citations.AUTO2); c.getIdentifiers().addAll(Citations.AUTO.getIdentifiers()); AUTHORITY = (Citation) c.unmodifiable(); } /** * Map of Factlets by integer code (from {@code AUTO:code}). * * @todo Replace this with full FactorySPI system. */ private final Map<Integer,Factlet> factlets = new TreeMap<Integer,Factlet>(); /** * Constructs a default factory for the {@code AUTO} authority. */ public AutoCRSFactory() { this(null); } /** * Constructs a factory for the {@code AUTO} authority using the specified hints. */ public AutoCRSFactory(final Hints hints) { super(hints, NORMAL_PRIORITY); add(Auto42001.DEFAULT); add(Auto42002.DEFAULT); add(Auto42003.DEFAULT); add(Auto42004.DEFAULT); // We don't actually support the Mollweide projection // add(Auto42005.DEFAULT); } /** * Add the specified factlet. */ private void add(final Factlet f) { final int code = f.code(); if (factlets.put(code, f) != null) { throw new IllegalArgumentException(String.valueOf(code)); } } /** * Returns the {@link Factlet} for the given code. * * @param code The code. * @return The fatclet for the specified code. * @throws NoSuchAuthorityCodeException if no factlet has been found for the specified code. */ private Factlet findFactlet(final Code code) throws NoSuchAuthorityCodeException { if (code.authority.equalsIgnoreCase("AUTO") || code.authority.equalsIgnoreCase("AUTO2")) { final Integer key = code.code; final Factlet fac = factlets.get(key); if (fac != null) { return fac; } } throw noSuchAuthorityCode(code.type, code.toString()); } /** * Returns the authority for this factory. */ public Citation getAuthority() { return AUTHORITY; } /** * Provides a complete set of the known codes provided by this authority. * The returned set contains only numeric identifiers like {@code "42001"}, * {@code "42002"}, <cite>etc</cite>. The authority name ({@code "AUTO"}) * and the {@code lon0,lat0} part are not included. This is consistent with the * {@linkplain org.geotools.referencing.factory.epsg.DirectEpsgFactory#getAuthorityCodes * codes returned by the EPSG factory} and avoid duplication, since the authority is the * same for every codes returned by this factory. It also make it easier for clients to * prepend whatever authority name they wish, as for example in the * {@linkplain org.geotools.referencing.factory.AllAuthoritiesFactory#getAuthorityCodes * all authorities factory}. */ public Set getAuthorityCodes(final Class type) throws FactoryException { if (type.isAssignableFrom(ProjectedCRS.class)) { final Set set = new LinkedHashSet(); for (final Iterator it=factlets.keySet().iterator(); it.hasNext();) { Integer code = (Integer) it.next(); set.add(String.valueOf(code)); } return set; } else { return Collections.EMPTY_SET; } } /** * Returns the CRS name for the given code. */ public InternationalString getDescriptionText(final String code) throws FactoryException { final Code c = new Code(code, ProjectedCRS.class); return new SimpleInternationalString(findFactlet(c).getName()); } /** * Creates an object from the specified code. The default implementation delegates to * <code>{@linkplain #createCoordinateReferenceSystem createCoordinateReferenceSystem}(code)</code>. */ public IdentifiedObject createObject(final String code) throws FactoryException { return createCoordinateReferenceSystem(code); } /** * Creates a coordinate reference system from the specified code. The default implementation * delegates to <code>{@linkplain #createProjectedCRS createProjectedCRS}(code)</code>. */ public CoordinateReferenceSystem createCoordinateReferenceSystem(final String code) throws FactoryException { return createProjectedCRS(code); } /** * Creates a projected coordinate reference system from the specified code. */ public ProjectedCRS createProjectedCRS(final String code) throws FactoryException { final Code c = new Code(code, ProjectedCRS.class); return findFactlet(c).create(c, factories); } }