blob: 83e29ba6a1dab001bc3263d3838c8fcbbfc1a959 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.referencing.factory;
import java.util.Collections;
import org.opengis.util.FactoryException;
import org.opengis.referencing.IdentifiedObject;
import org.opengis.referencing.crs.CRSAuthorityFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.crs.GeographicCRS;
import org.apache.sis.referencing.crs.DefaultGeographicCRS;
// Test imports
import org.apache.sis.test.DependsOnMethod;
import org.apache.sis.test.DependsOn;
import org.apache.sis.test.TestCase;
import org.junit.Test;
import static org.apache.sis.test.Assert.*;
/**
* Tests {@link IdentifiedObjectFinder}.
* This test uses {@link CommonAuthorityFactory} as a simple factory implementation.
*
* @author Martin Desruisseaux (Geomatys)
* @version 0.7
* @since 0.7
* @module
*/
@DependsOn({CommonAuthorityFactoryTest.class, AuthorityFactoryProxyTest.class})
public final strictfp class IdentifiedObjectFinderTest extends TestCase {
/**
* The factory to use for the test.
*/
private GeodeticAuthorityFactory factory;
/**
* Initializes the factory to test.
*/
public IdentifiedObjectFinderTest() {
factory = new CommonAuthorityFactory();
}
/**
* Tests the {@link IdentifiedObjectFinder#findSingleton(IdentifiedObject)} method.
*
* @throws FactoryException if the creation of a CRS failed.
*/
@Test
public void testFindSingleton() throws FactoryException {
final GeographicCRS CRS84 = factory.createGeographicCRS("CRS:84");
final IdentifiedObjectFinder finder = factory.newIdentifiedObjectFinder();
assertEquals("Newly created finder should default to full scan.",
IdentifiedObjectFinder.Domain.VALID_DATASET, finder.getSearchDomain());
finder.setSearchDomain(IdentifiedObjectFinder.Domain.DECLARATION);
assertSame("Should find without the need for scan, since we can use the CRS:84 identifier.",
CRS84, finder.findSingleton(CRS84));
finder.setSearchDomain(IdentifiedObjectFinder.Domain.VALID_DATASET);
assertSame("Allowing scanning should not make any difference for this CRS84 instance.",
CRS84, finder.findSingleton(CRS84));
/*
* Same test than above, using a CRS without identifier.
* The intent is to force a full scan.
*/
final CoordinateReferenceSystem search = new DefaultGeographicCRS(
Collections.singletonMap(DefaultGeographicCRS.NAME_KEY, CRS84.getName()),
CRS84.getDatum(), CRS84.getCoordinateSystem());
assertEqualsIgnoreMetadata(CRS84, search); // Required condition for next test.
finder.setSearchDomain(IdentifiedObjectFinder.Domain.DECLARATION);
assertNull("Should not find WGS84 without a full scan, since it does not contains the CRS:84 identifier.",
finder.findSingleton(search));
finder.setSearchDomain(IdentifiedObjectFinder.Domain.VALID_DATASET);
assertSame("A full scan should allow us to find WGS84, since it is equals ignoring metadata to CRS:84.",
CRS84, finder.findSingleton(search));
}
/**
* Tests the {@link IdentifiedObjectFinder#findSingleton(IdentifiedObject)} method through the finder
* provided by {@link ConcurrentAuthorityFactory}. The objects found are expected to be cached.
*
* @throws FactoryException if the creation of a CRS failed.
*/
@Test
@DependsOnMethod("testFindSingleton")
public void testFindOnCachingInstance() throws FactoryException {
factory = new Cached(factory);
testFindSingleton();
}
/**
* An authority factory to be used by {@link IdentifiedObjectFinderTest#testFindOnCachingInstance()}.
*/
private static final strictfp class Cached extends ConcurrentAuthorityFactory<GeodeticAuthorityFactory>
implements CRSAuthorityFactory
{
private final GeodeticAuthorityFactory factory;
public Cached(final GeodeticAuthorityFactory factory) {
super(GeodeticAuthorityFactory.class);
this.factory = factory;
}
@Override
protected GeodeticAuthorityFactory newDataAccess() {
return factory;
}
}
}