blob: d26da7015598548189f2185ad9eefccfe5a169ff [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.iso;
import java.util.Date;
import java.util.Locale;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Collection;
import java.net.URISyntaxException;
import javax.xml.bind.JAXBException;
import org.opengis.metadata.MetadataScope;
import org.opengis.metadata.citation.Citation;
import org.opengis.metadata.citation.DateType;
import org.opengis.metadata.maintenance.ScopeCode;
import org.apache.sis.xml.Namespaces;
import org.apache.sis.util.iso.SimpleInternationalString;
import org.apache.sis.metadata.iso.citation.DefaultCitation;
import org.apache.sis.metadata.iso.citation.DefaultCitationDate;
import org.apache.sis.test.xml.TestCase;
import org.apache.sis.test.DependsOn;
import org.junit.Test;
import static org.apache.sis.test.MetadataAssert.*;
import static org.apache.sis.test.TestUtilities.date;
import static org.apache.sis.test.TestUtilities.getSingleton;
/**
* Tests {@link DefaultMetadata}, without Coordinate Reference System (CRS) information.
*
* <p><b>Note:</b> a metadata object with CRS information is tested by a different
* {@code org.apache.sis.test.integration.DefaultMetadataTest} class in the {@code sis-referencing} module.</p>
*
* @author Cédric Briançon (Geomatys)
* @author Martin Desruisseaux (Geomatys)
* @author Cullen Rombach (Image Matters)
* @version 1.0
* @since 0.3
* @module
*/
@DependsOn(org.apache.sis.internal.jaxb.lan.OtherLocalesTest.class)
public final strictfp class DefaultMetadataTest extends TestCase {
/**
* Tests unmarshalling of a metadata having a collection that contains no element.
* This was used to cause a {@code NullPointerException} prior SIS-139 fix.
*
* @throws JAXBException if an error occurred during the during unmarshalling processes.
*
* @see <a href="https://issues.apache.org/jira/browse/SIS-139">SIS-139</a>
*/
@Test
public void testEmptyCollection() throws JAXBException {
final DefaultMetadata metadata = unmarshal(DefaultMetadata.class,
"<mdb:MD_Metadata xmlns:mdb=\"" + Namespaces.MDB + "\">\n" +
" <mdb:contact/>\n" +
"</mdb:MD_Metadata>");
/*
* Verify metadata property.
*/
assertTrue(metadata.getContacts().isEmpty());
}
/**
* Tests {@link DefaultMetadata#getFileIdentifier()} and {@link DefaultMetadata#setFileIdentifier(String)}
* legacy methods. Those methods should delegate to newer methods.
*
* @since 0.5
*/
@Test
@SuppressWarnings("deprecation")
public void testFileIdentifier() {
final DefaultMetadata metadata = new DefaultMetadata();
assertNull("fileIdentifier", metadata.getFileIdentifier());
metadata.setFileIdentifier("Apache SIS/Metadata test");
assertEquals("metadataIdentifier", "Apache SIS/Metadata test", metadata.getMetadataIdentifier().getCode());
assertEquals("fileIdentifier", "Apache SIS/Metadata test", metadata.getFileIdentifier());
}
/**
* Tests {@link DefaultMetadata#getLanguage()}, {@link DefaultMetadata#setLanguage(Locale)}
* and {@link DefaultMetadata#getLocales()} legacy methods.
* Those methods should delegate to newer methods.
*
* @since 0.5
*/
@Test
@SuppressWarnings("deprecation")
public void testLocales() {
final DefaultMetadata metadata = new DefaultMetadata();
assertNull("language", metadata.getLanguage());
/*
* Set the default language, which shall be the first entry in the collection.
* The "other locales" property shall be unmodified by the "language" one.
*/
metadata.setLanguage(Locale.JAPANESE);
assertLanguagesEquals(metadata, Locale.JAPANESE);
/*
* Add other languages. They should appear as additional entries after the first one.
* The "language" property shall be unmodified by changes in the "other locales" one.
*/
metadata.getLocales().addAll(Arrays.asList(Locale.FRENCH, Locale.ENGLISH));
assertLanguagesEquals(metadata, Locale.JAPANESE, Locale.FRENCH, Locale.ENGLISH);
/*
* Ensure that the "locales" list is modifiable, since JAXB writes directly in it.
*/
metadata.getLocales().clear();
assertLanguagesEquals(metadata, Locale.JAPANESE);
final Collection<Locale> locales = metadata.getLocales();
assertTrue(locales.add(Locale.KOREAN));
assertTrue(locales.add(Locale.ENGLISH));
assertLanguagesEquals(metadata, Locale.JAPANESE, Locale.KOREAN, Locale.ENGLISH);
/*
* Changing again the default language shall not change the other locales.
*/
metadata.setLanguage(Locale.GERMAN);
assertLanguagesEquals(metadata, Locale.GERMAN, Locale.KOREAN, Locale.ENGLISH);
}
/**
* Compares the {@link DefaultMetadata#getLanguages()}, {@link DefaultMetadata#getLanguage()} and
* {@link DefaultMetadata#getLocales()} values against the expected array.
*/
@SuppressWarnings("deprecation")
private static void assertLanguagesEquals(final DefaultMetadata metadata, final Locale... expected) {
assertArrayEquals("languages", expected, metadata.getLanguages().toArray());
assertEquals ("language", expected[0], metadata.getLanguage());
assertArrayEquals("locales", Arrays.copyOfRange(expected, 1, expected.length), metadata.getLocales().toArray());
}
/**
* Tests {@link DefaultMetadata#getParentIdentifier()} and {@link DefaultMetadata#setParentIdentifier(String)}
* methods.
*/
@Test
@SuppressWarnings("deprecation")
public void testParentIdentifier() {
final DefaultMetadata metadata = new DefaultMetadata();
assertNull("parentIdentifier", metadata.getParentIdentifier());
metadata.setParentIdentifier("ParentID");
assertEquals("parentIdentifier", "ParentID", metadata.getParentIdentifier());
DefaultCitation c = (DefaultCitation) metadata.getParentMetadata();
assertTitleEquals("parentMetadata", "ParentID", c);
c.setTitle(new SimpleInternationalString("New parent"));
assertEquals("parentIdentifier", "New parent", metadata.getParentIdentifier());
}
/**
* Tests {@link DefaultMetadata#getHierarchyLevels()}, {@link DefaultMetadata#getHierarchyLevelNames()},
* {@link DefaultMetadata#setHierarchyLevels(Collection)} and {@link DefaultMetadata#setHierarchyLevelNames(Collection)}
* methods.
*/
@Test
@SuppressWarnings("deprecation")
public void testHierarchyLevels() {
final String[] names = new String[] {"Bridges", "Golden Gate Bridge"};
final ScopeCode[] levels = new ScopeCode[] {ScopeCode.FEATURE_TYPE, ScopeCode.FEATURE};
final DefaultMetadata metadata = new DefaultMetadata();
assertTrue("hierarchyLevelNames", metadata.getHierarchyLevelNames().isEmpty());
assertTrue("hierarchyLevels", metadata.getHierarchyLevels().isEmpty());
/*
* Tests the setter and verify immediately with the getter methods.
*/
metadata.setHierarchyLevelNames(Arrays.asList(names));
metadata.setHierarchyLevels(Arrays.asList(levels));
assertArrayEquals("hierarchyLevelNames", names, metadata.getHierarchyLevelNames().toArray());
assertArrayEquals("hierarchyLevels", levels, metadata.getHierarchyLevels().toArray());
/*
* The above deprecated methods shall have created MetadataScope object. Verify that.
*/
final Collection<MetadataScope> scopes = metadata.getMetadataScopes();
final Iterator<MetadataScope> it = scopes.iterator();
MetadataScope scope = it.next();
assertEquals("metadataScopes[0].name", "Bridges", scope.getName().toString());
assertEquals("metadataScopes[0].resourceScope", ScopeCode.FEATURE_TYPE, scope.getResourceScope());
scope = it.next();
assertEquals("metadataScopes[1].name", "Golden Gate Bridge", scope.getName().toString());
assertEquals("metadataScopes[1].resourceScope", ScopeCode.FEATURE, scope.getResourceScope());
/*
* Changes in the MetadataScope object shall be reflected immediately on the scope collection.
* Verify that.
*/
it.remove();
assertFalse(it.hasNext());
final DefaultMetadataScope c = new DefaultMetadataScope(
levels[1] = ScopeCode.ATTRIBUTE_TYPE,
names [1] = "Clearance");
assertTrue(scopes.add(c));
assertArrayEquals("hierarchyLevelNames", names, metadata.getHierarchyLevelNames().toArray());
assertArrayEquals("hierarchyLevels", levels, metadata.getHierarchyLevels().toArray());
/*
* Test the customized equals(Object) and hashCode() implementations.
* Note: the 'assertNotSame' check is not a contract requirement. It is just that if
* 'n1' and 'n2' are the same, then the test become pointless and should be removed.
*/
Collection<String> n1 = metadata.getHierarchyLevelNames();
Collection<String> n2 = metadata.getHierarchyLevelNames();
assertNotSame("Remove this test.", n1, n2); // See above comment.
assertTrue("equals", n1.equals(n2));
assertTrue("equals", n2.equals(n1));
assertEquals("hashCode", n1.hashCode(), n2.hashCode());
}
/**
* Tests {@link DefaultMetadata#getDateStamp()} and {@link DefaultMetadata#setDateStamp(Date)} methods.
*/
@Test
@SuppressWarnings("deprecation")
public void testDateStamp() {
final DefaultMetadata metadata = new DefaultMetadata();
assertNull("dateStamp", metadata.getDateStamp());
/*
* Verifies that the deprecated method get its value from the CitationDate objects.
*/
Date creation = date("2014-10-07 00:00:00");
final DefaultCitationDate[] dates = new DefaultCitationDate[] {
new DefaultCitationDate(date("2014-10-09 00:00:00"), DateType.LAST_UPDATE),
new DefaultCitationDate(creation, DateType.CREATION)
};
metadata.setDateInfo(Arrays.asList(dates));
assertEquals("dateStamp", creation, metadata.getDateStamp());
/*
* Invoking the deprecated setters shall modify the CitationDate object
* associated to DateType.CREATION.
*/
creation = date("2014-10-06 00:00:00");
metadata.setDateStamp(creation);
assertEquals("citationDates[1].date", creation, dates[1].getDate());
assertArrayEquals("dates", dates, metadata.getDateInfo().toArray());
}
/**
* Tests {@link DefaultMetadata#getMetadataStandardName()}, {@link DefaultMetadata#getMetadataStandardVersion()},
* {@link DefaultMetadata#setMetadataStandardName(String)} and {@link DefaultMetadata#setMetadataStandardVersion(String)}
* methods.
*/
@Test
@SuppressWarnings("deprecation")
public void testMetadataStandard() {
final DefaultMetadata metadata = new DefaultMetadata();
assertNull("metadataStandardName", metadata.getMetadataStandardName());
assertNull("metadataStandardVersion", metadata.getMetadataStandardVersion());
String name = "ISO 19115-2 Geographic Information - Metadata Part 2 Extensions for imagery and gridded data";
String version = "ISO 19115-2:2019";
metadata.setMetadataStandardName(name);
metadata.setMetadataStandardVersion(version);
assertEquals("metadataStandardName", name, metadata.getMetadataStandardName());
assertEquals("metadataStandardVersion", version, metadata.getMetadataStandardVersion());
final Citation standard = getSingleton(metadata.getMetadataStandards());
assertTitleEquals("standard", name, standard);
assertEquals(version, standard.getEdition().toString());
}
/**
* Tests {@link DefaultMetadata#getDataSetUri()}.
*
* @throws URISyntaxException if the URI used in this test is malformed.
*/
@Test
@SuppressWarnings("deprecation")
public void testDataSetUri() throws URISyntaxException {
final DefaultMetadata metadata = new DefaultMetadata();
metadata.setDataSetUri("file:/tmp/myfile.txt");
assertEquals("file:/tmp/myfile.txt", metadata.getDataSetUri());
assertEquals("file:/tmp/myfile.txt", getSingleton(getSingleton(metadata.getIdentificationInfo())
.getCitation().getOnlineResources()).getLinkage().toString());
}
}