/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2007-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; import java.net.URL; import java.util.Iterator; import java.util.Set; import org.geotools.referencing.CRS; import org.geotools.referencing.ReferencingFactoryFinder; import org.geotools.referencing.WKT; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CRSAuthorityFactory; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.crs.ProjectedCRS; import org.junit.*; import static org.junit.Assert.*; /** * Checks the exception thrown by the fallback system do report actual errors when the code is * available but for some reason broken, and not "code not found" ones. * * * @source $URL$ * @version $Id$ * @author Andrea Aime (TOPP) */ public final class FallbackAuthorityFactoryTest { /** * Set to {@code true} for printing debugging information. */ private static final boolean VERBOSE = false; /** * The extra factory. */ private FactoryEPSGExtra extra; /** * Adds the extra factory to the set of authority factories. */ @Before public void setUp() { assertNull(extra); extra = new FactoryEPSGExtra(); ReferencingFactoryFinder.addAuthorityFactory(extra); ReferencingFactoryFinder.scanForPlugins(); } /** * Removes the extra factory from the set of authority factories. */ @After public void tearDown() { assertNotNull(extra); ReferencingFactoryFinder.removeAuthorityFactory(extra); extra = null; } /** * Makes sure that the testing {@link FactoryEPSGExtra} has precedence over * {@link FactoryUsingWKT}. */ @Test public void testFactoryOrdering() { Set factories = ReferencingFactoryFinder.getCRSAuthorityFactories(null); boolean foundWkt = false; boolean foundExtra = false; for (Iterator it = factories.iterator(); it.hasNext();) { CRSAuthorityFactory factory = (CRSAuthorityFactory) it.next(); Class type = factory.getClass(); if (VERBOSE) { System.out.println(type); } if (type == FactoryEPSGExtra.class) { foundExtra = true; } else if (type == FactoryUsingWKT.class) { foundWkt = true; assertTrue("We should have encountered WKT factory after the extra one", foundExtra); } } assertTrue(foundWkt); assertTrue(foundExtra); } /** * Tests the {@code 42101} code. The purpose of this test is mostly * to make sure that {@link FactoryUsingWKT} is in the chain. * * @throws FactoryException If the CRS can't be created. */ @Test public void test42101() throws FactoryException { assertTrue(CRS.decode("EPSG:42101") instanceof ProjectedCRS); } /** * Tests the {@code 00001} fake code. * * @throws FactoryException If the CRS can't be created. */ @Test public void test00001() throws FactoryException { try { CRS.decode("EPSG:00001"); fail("This code should not be there"); } catch (NoSuchAuthorityCodeException e) { fail("The code 00001 is there, exception should report it's broken"); } catch (FactoryException e) { // cool, that's what we expected } } /** * GEOT-1702, make sure looking up for an existing code does not result in a * {@link StackOverflowException}. * * @throws FactoryException If the CRS can't be created. */ @Test public void testLookupSuccessfull() throws FactoryException { CoordinateReferenceSystem crs = CRS.decode("EPSG:42101"); String code = CRS.lookupIdentifier(crs, true); assertEquals("EPSG:42101", code); } /** * GEOT-1702, make sure looking up for a non existing code does not result in a * {@link StackOverflowException}. * * @throws FactoryException If the CRS can't be created. */ @Test public void testLookupFailing() throws FactoryException { CoordinateReferenceSystem crs = CRS.parseWKT(WKT.MERCATOR_GOOGLE); assertNull(CRS.lookupIdentifier(crs, true)); } /** * Extra class used to make sure we have {@link FactoryUsingWKT} among the fallbacks * (used to check the fallback mechanism). * * @author Andrea Aime (TOPP) */ private static class FactoryEPSGExtra extends FactoryUsingWKT { /** * Creates a factory to be registered before {@link FactoryUsingWKT} in the fallback chain. */ public FactoryEPSGExtra() { // make sure we are before FactoryUsingWKT in the fallback chain super(null, DEFAULT_PRIORITY + 5); } /** * Returns the URL to the test file that contains a broken CRS for code EPSG:1. */ @Override protected URL getDefinitionsURL() { return FactoryUsingWKT.class.getResource("epsg2.properties"); } } }