blob: a1d4ad0cd1f5be2c8a55bbd02b47b413ed92e150 [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.metadata.sql;
import java.util.Set;
import org.opengis.util.InternationalString;
import org.opengis.metadata.Identifier;
import org.opengis.metadata.citation.Citation;
import org.apache.sis.metadata.MetadataStandard;
import org.apache.sis.metadata.internal.CitationConstant;
import org.apache.sis.metadata.iso.citation.Citations;
import static org.apache.sis.util.privy.CollectionsExt.first;
// Test dependencies
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
// Specific to the geoapi-3.1 and geoapi-4.0 branches:
import org.opengis.metadata.citation.Party;
import org.opengis.metadata.citation.Responsibility;
/**
* Compares the {@link MetadataFallback} hard-coded values with the {@code Citations.sql} content.
* This test is actually invoked by {@link MetadataSourceTest} in order to opportunistically use
* the database created by the latter (i.e. for avoiding to recreate the same database many times).
*
* @author Martin Desruisseaux (Geomatys)
*/
public final class MetadataFallbackVerifier {
/**
* Identifier for which {@link MetadataFallback} does not provide hard-coded values.
*/
private static final Set<String> EXCLUDES = Set.of("NetCDF", "GeoTIFF", "ArcGIS", "MapInfo");
/**
* Creates a new test case.
*/
public MetadataFallbackVerifier() {
}
/**
* Creates a temporary database for comparing {@link MetadataFallback} content with database content.
* This method is provided for allowing to execute this class individually. In a complete Maven build,
* of {@code org.apache.sis.metadata} module, the test will rather be executed by {@link MetadataSourceTest}
* for opportunistic reasons.
*
* @throws Exception if an exception occurred while creating or comparing the database.
*/
@Test
public void compare() throws Exception {
try (TestDatabase db = TestDatabase.create("MetadataFallback");
MetadataSource source = new MetadataSource(MetadataStandard.ISO_19115, db.source, "metadata", null))
{
source.install();
compare(source);
}
}
/**
* Compares {@link MetadataFallback} content with database content using the given source.
* This method is invoked by {@link MetadataSourceTest} for opportunistically reusing the
* available database.
*/
static void compare(final MetadataSource source) throws MetadataStoreException {
for (final Citation c : Citations.values()) {
final String name = ((CitationConstant) c).title;
final boolean exclude = EXCLUDES.contains(name);
final Citation fromFB = MetadataFallback.createCitation(name);
assertEquals(exclude, fromFB == null, name); // Verify that missing fallbacks are known ones.
if (!exclude) {
compare(name, source.lookup(Citation.class, name), fromFB);
}
}
compare("IOGP", source.lookup(Citation.class, "IOGP"), MetadataFallback.createCitation("IOGP"));
}
/**
* Compares a fallback citation from the citation declared in the database.
*
* @param name identifier used in assertions for identifying which citation failed.
* @param fromDB citation read from the database.
* @param fromFB citation created by {@link MetadataFallback}.
*/
private static void compare(final String name, final Citation fromDB, final Citation fromFB) {
/*
* The database may contain more verbose title than the one declared in MetadataFallback,
* in which case the shorter title appears as alternate title.
*/
final InternationalString expectedAltTitle = first(fromDB.getAlternateTitles());
final InternationalString actualAltTitle = first(fromFB.getAlternateTitles());
if (fromFB.getTitle().equals(expectedAltTitle)) {
assertNull(actualAltTitle, name);
} else {
assertEquals(fromDB.getTitle(), fromFB.getTitle(), name);
if (actualAltTitle != null) {
assertEquals(expectedAltTitle, actualAltTitle, name);
}
}
/*
* The fallback may not declare all identifiers (but it should not declare more).
* If it declares an identifier, it should be equal.
*/
final Identifier expectedID = first(fromDB.getIdentifiers());
final Identifier actualID = first(fromFB.getIdentifiers());
if (expectedID == null) {
assertNull(actualID, name);
} else if (actualID != null) {
assertEquals(expectedID.getCode(), actualID.getCode(), name);
assertEquals(expectedID.getCodeSpace(), actualID.getCodeSpace(), name);
assertEquals(expectedID.getVersion(), actualID.getVersion(), name);
}
/*
* The fallback may not declare all responsible parties.
* If it declares a party, the name and role shall be equal.
*/
final Responsibility expectedResp = first(fromDB.getCitedResponsibleParties());
final Responsibility actualResp = first(fromFB.getCitedResponsibleParties());
if (expectedResp == null) {
assertNull(actualResp, name);
} else if (actualResp != null) {
assertEquals(expectedResp.getRole(), actualResp.getRole(), name);
final Party expectedParty = first(expectedResp.getParties());
final Party actualParty = first(actualResp.getParties());
assertEquals(expectedParty.getName(), actualParty.getName(), name);
}
assertEquals(first(fromDB.getPresentationForms()),
first(fromFB.getPresentationForms()), name);
}
}