/*
* 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.
*/
package org.geotools.referencing.factory.epsg;
// J2SE dependencies
import java.util.HashMap;
import java.util.Map;
// OpenGIS dependencies
import org.opengis.referencing.AuthorityFactory;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.IdentifiedObject;
import org.opengis.referencing.crs.CRSAuthorityFactory;
import org.opengis.referencing.operation.CoordinateOperation; // For javadoc
import org.opengis.referencing.operation.CoordinateOperationAuthorityFactory;
// Geotools dependencies
import org.geotools.referencing.factory.IdentifiedObjectSet;
/**
* A lazy set of {@link CoordinateOperation} objects to be returned by the
* {@link DirectEpsgFactory#createFromCoordinateReferenceSystemCodes
* createFromCoordinateReferenceSystemCodes} method.
*
* @since 2.2
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux (IRD)
*/
final class CoordinateOperationSet extends IdentifiedObjectSet {
/**
* For compatibility with previous versions.
*/
private static final long serialVersionUID = -2421669857023064667L;
/**
* The codes of {@link ProjectedCRS} objects for the specified {@link Conversion} codes,
* or {@code null} if none.
*/
private Map/*<String,String>*/ projections;
/**
* Creates a new instance of this lazy set.
*/
public CoordinateOperationSet(final AuthorityFactory factory) {
super(factory);
}
/**
* Add the specified authority code.
*
* @param code The code for the {@link CoordinateOperation} to add.
* @param crs The code for the CRS is create instead of the operation,
* or {@code null} if none.
*/
public boolean addAuthorityCode(final String code, final String crs) {
if (crs != null) {
if (projections == null) {
projections = new HashMap();
}
projections.put(code, crs);
}
return super.addAuthorityCode(code);
}
/**
* Creates an object for the specified code.
*/
protected IdentifiedObject createObject(final String code) throws FactoryException {
if (projections != null) {
final String crs = (String) projections.get(code);
if (crs != null) {
return ((CRSAuthorityFactory) factory).createProjectedCRS(crs).getConversionFromBase();
}
}
return ((CoordinateOperationAuthorityFactory) factory).createCoordinateOperation(code);
}
}