blob: 3d02984e4c22dfe793b9483628ccfd8519901f09 [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.xml;
import javax.xml.bind.JAXBException;
import org.opengis.metadata.citation.Address;
import org.opengis.metadata.Identifier;
import org.opengis.metadata.acquisition.Instrument;
import org.opengis.metadata.identification.DataIdentification;
import org.opengis.metadata.identification.InitiativeType;
import org.apache.sis.internal.jaxb.metadata.replace.ReferenceSystemMetadata;
import org.apache.sis.internal.xml.LegacyNamespaces;
import org.apache.sis.internal.metadata.SensorType;
import org.apache.sis.util.iso.Types;
import org.apache.sis.test.DependsOnMethod;
import org.apache.sis.test.xml.TestCase;
import org.junit.Test;
import static org.apache.sis.test.MetadataAssert.*;
/**
* Tests the XML marshalling of {@code Anchor} and {@code CodeList} as substitution of {@code <gco:CharacterSequence>}.
*
* @author Martin Desruisseaux (Geomatys)
* @author Cullen Rombach (Image Matters)
* @version 1.0
* @since 0.3
* @module
*/
public final strictfp class CharSequenceSubstitutionTest extends TestCase {
/**
* Tests unmarshalling of {@code "RS_Identifier"} element. This element was defined in legacy ISO 19139:2007
* but has been removed in ISO 19115-3. That element is extensively used for Coordinate Reference Systems in
* GML 3.2.
*
* @throws JAXBException if the unmarshalling failed.
*/
@Test
@DependsOnMethod("testAnchorForString")
public void testLegacy() throws JAXBException {
final String expected =
"<gmd:MD_ReferenceSystem xmlns:gmd=\"" + LegacyNamespaces.GMD + '"' +
" xmlns:gmx=\"" + LegacyNamespaces.GMX + '"' +
" xmlns:gco=\"" + LegacyNamespaces.GCO + '"' +
" xmlns:xlink=\"" + Namespaces.XLINK + "\">\n" +
" <gmd:referenceSystemIdentifier>" +
" <gmd:RS_Identifier>" +
" <gmd:code>\n" +
" <gmx:Anchor xlink:href=\"SDN:L101:2:4326\">EPSG:4326</gmx:Anchor>\n" +
" </gmd:code>\n" +
" <gmd:codeSpace>\n" +
" <gco:CharacterString>L101</gco:CharacterString>\n" +
" </gmd:codeSpace>\n" +
" </gmd:RS_Identifier>" +
" </gmd:referenceSystemIdentifier>" +
"</gmd:MD_ReferenceSystem>";
final ReferenceSystemMetadata md = unmarshal(ReferenceSystemMetadata.class, expected);
final Identifier id = md.getName();
assertEquals("codespace", "L101", id.getCodeSpace());
assertEquals("code", "EPSG:4326", id.getCode());
}
/**
* Tests unmarshalling of anchor in an identifier element. The {@code xlink:href} attribute
* is lost because the Java type of the {@code gmd:code} attribute is {@link String}.
*
* @throws JAXBException if the unmarshalling failed.
*/
@Test
@DependsOnMethod("testAnchor")
public void testAnchorForString() throws JAXBException {
final String expected =
"<mcc:MD_Identifier xmlns:mcc=\"" + Namespaces.MCC + '"' +
" xmlns:gcx=\"" + Namespaces.GCX + '"' +
" xmlns:gco=\"" + Namespaces.GCO + '"' +
" xmlns:xlink=\"" + Namespaces.XLINK + "\">\n" +
" <mcc:code>\n" +
" <gcx:Anchor xlink:href=\"SDN:L101:2:4326\">EPSG:4326</gcx:Anchor>\n" +
" </mcc:code>\n" +
" <mcc:codeSpace>\n" +
" <gco:CharacterString>L101</gco:CharacterString>\n" +
" </mcc:codeSpace>\n" +
"</mcc:MD_Identifier>";
final Identifier id = unmarshal(Identifier.class, expected);
assertEquals("codespace", "L101", id.getCodeSpace());
assertEquals("code", "EPSG:4326", id.getCode());
}
/**
* Tests the anchor in the country property of an address element.
* Contrarily to {@link #testAnchorForString()}, this method can test both marshalling and unmarshalling.
*
* @throws JAXBException if the (un)marshalling failed.
*/
@Test
public void testAnchor() throws JAXBException {
final String expected =
"<cit:CI_Address xmlns:cit=\"" + Namespaces.CIT + '"' +
" xmlns:gcx=\"" + Namespaces.GCX + '"' +
" xmlns:gco=\"" + Namespaces.GCO + '"' +
" xmlns:xlink=\"" + Namespaces.XLINK + "\">\n" +
" <cit:deliveryPoint>\n" +
" <gco:CharacterString>Centre IFREMER de Brest BP 70</gco:CharacterString>\n" +
" </cit:deliveryPoint>\n" +
" <cit:city>\n" +
" <gco:CharacterString>Plouzané</gco:CharacterString>\n" +
" </cit:city>\n" +
" <cit:postalCode>\n" +
" <gco:CharacterString>29280</gco:CharacterString>\n" +
" </cit:postalCode>\n" +
" <cit:country>\n" +
" <gcx:Anchor xlink:href=\"SDN:C320:2:FR\">France</gcx:Anchor>\n" +
" </cit:country>\n" +
" <cit:electronicMailAddress>\n" +
" <gco:CharacterString>(hiden)@ifremer.fr</gco:CharacterString>\n" +
" </cit:electronicMailAddress>\n" +
"</cit:CI_Address>";
final Address address = unmarshal(Address.class, expected);
assertEquals("Plouzané", address.getCity().toString());
assertEquals("France", address.getCountry().toString());
assertEquals(1, address.getElectronicMailAddresses().size());
final XLink anchor = (XLink) address.getCountry();
assertEquals("France", anchor.toString());
assertEquals("SDN:C320:2:FR", anchor.getHRef().toString());
assertNull(anchor.getType());
anchor.setType(XLink.Type.AUTO);
assertEquals(XLink.Type.LOCATOR, anchor.getType());
final String actual = marshal(address);
assertXmlEquals(expected, actual, "xmlns:*");
}
/**
* Tests substitution by a code list.
*
* @throws JAXBException if the (un)marshalling failed.
*
* @since 0.7
*/
@Test
public void testCodeList() throws JAXBException {
final String expected =
"<mri:MD_DataIdentification xmlns:mri=\"" + Namespaces.MRI + "\">\n" +
" <mri:purpose>\n" +
" <mri:DS_InitiativeTypeCode\n" +
" codeList=\"http://standards.iso.org/iso/19115/resources/Codelist/cat/codelists.xml#DS_InitiativeTypeCode\"\n" +
" codeListValue=\"investigation\">Investigation</mri:DS_InitiativeTypeCode>\n" +
" </mri:purpose>\n" +
"</mri:MD_DataIdentification>";
final DataIdentification id = unmarshal(DataIdentification.class, expected);
assertEquals("purpose", "Investigation", String.valueOf(id.getPurpose()));
assertSame("purpose", InitiativeType.INVESTIGATION, Types.forCodeTitle(id.getPurpose()));
final String actual = marshal(id);
assertXmlEquals(expected, actual, "xmlns:*");
}
/**
* Tests the code list in a sensor element.
*
* @throws JAXBException if the (un)marshalling failed.
*
* @since 0.7
*/
@Test
@DependsOnMethod("testCodeList")
public void testSensorCode() throws JAXBException {
final String expected =
"<gmi:MI_Instrument xmlns:gmd=\"" + LegacyNamespaces.GMD + '"' +
" xmlns:gmi=\"" + LegacyNamespaces.GMI + "\">\n" +
" <gmi:type>\n" +
" <gmi:MI_SensorTypeCode\n" +
" codeList=\"http://navigator.eumetsat.int/metadata_schema/eum/resources/Codelist/eum_gmxCodelists.xml#CI_SensorTypeCode\"\n" +
" codeListValue=\"RADIOMETER\">RADIOMETER</gmi:MI_SensorTypeCode>\n" +
" </gmi:type>\n" +
"</gmi:MI_Instrument>";
final Instrument instrument = unmarshal(Instrument.class, expected);
assertEquals("type", "RADIOMETER", String.valueOf(instrument.getType()));
assertInstanceOf("type", SensorType.class, Types.forCodeTitle(instrument.getType()));
}
}