/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.test; import static org.junit.Assert.*; import org.junit.Test; import org.geoserver.test.OneTimeSetupTest.OneTimeTestSetup; import org.geoserver.wfs.WFSInfo; import org.w3c.dom.Document; import org.w3c.dom.Node; /** * @author Xiangtan Lin, CSIRO Information Management and Technology * */ public class PropertyEncodingOrderTest extends AbstractAppSchemaTestSupport { @Override protected PropertyEncodingOrderMockData createTestData() { return new PropertyEncodingOrderMockData(); } /** * Test the gmsl:Borehole is encoded in the right order, in particular this test is created for * an encoding order issue with gsml:indexData according to the schema * http://www.geosciml.org/geosciml/2.0/xsd/borehole.xsd * */ @Test public void testPropertyEncodingOrder_Borehole() throws Exception { String path = "wfs?request=GetFeature&version=1.1.0&typename=gsml:Borehole"; Document doc = getAsDOM(path); LOGGER.info("WFS GetFeature&gsml:Borehole:\n" + prettyString(doc)); assertXpathEvaluatesTo("1", "/wfs:FeatureCollection/@numberOfFeatures", doc); assertXpathCount(1, "//gsml:Borehole[@gml:id='BOREHOLE.WTB5']", doc); Node borehole = doc.getElementsByTagName("gsml:Borehole").item(0); assertEquals("gsml:Borehole", borehole.getNodeName()); // check for gml:id assertEquals("BOREHOLE.WTB5", borehole.getAttributes().getNamedItem("gml:id") .getNodeValue()); // gml:name Node name = borehole.getFirstChild(); assertEquals("gml:name", name.getNodeName()); assertEquals("WTB5 TEST", name.getFirstChild().getNodeValue()); // sa:sampledFeature Node sampledFeature = name.getNextSibling(); assertEquals("sa:sampledFeature", sampledFeature.getNodeName()); // sa:shape Node shape = sampledFeature.getNextSibling(); assertEquals("sa:shape", shape.getNodeName()); Node posList = shape.getFirstChild().getFirstChild(); assertEquals("gml:posList", posList.getNodeName()); assertEquals("-28.4139 121.142 -28.4139 121.142", posList.getFirstChild().getNodeValue()); // gsml:collarLocation Node collarLocation = shape.getNextSibling(); assertEquals("gsml:collarLocation", collarLocation.getNodeName()); Node boreholeCollar = collarLocation.getFirstChild(); assertEquals("gsml:BoreholeCollar", boreholeCollar.getNodeName()); assertEquals("BOREHOLE.COLLAR.WTB5", boreholeCollar.getAttributes().getNamedItem("gml:id") .getNodeValue()); assertEquals("-28.4139 121.142", boreholeCollar.getFirstChild().getFirstChild() .getFirstChild().getFirstChild().getNodeValue()); assertEquals("1.0", boreholeCollar.getFirstChild().getNextSibling().getFirstChild() .getNodeValue()); // gsml:indexData Node indexData = collarLocation.getNextSibling(); assertEquals("gsml:indexData", indexData.getNodeName()); Node boreholeDetails = indexData.getFirstChild(); assertEquals("gsml:BoreholeDetails", boreholeDetails.getNodeName()); Node operator = boreholeDetails.getFirstChild(); assertEquals("GSWA", operator.getAttributes().getNamedItem("xlink:title").getNodeValue()); Node dateOfDrilling = operator.getNextSibling(); assertEquals("2004-09-17", dateOfDrilling.getFirstChild().getNodeValue()); Node drillingMethod = dateOfDrilling.getNextSibling(); assertEquals("diamond core", drillingMethod.getFirstChild().getNodeValue()); Node startPoint = drillingMethod.getNextSibling(); assertEquals("natural ground surface", startPoint.getFirstChild().getNodeValue()); Node inclinationType = startPoint.getNextSibling(); assertEquals("vertical", inclinationType.getFirstChild().getNodeValue()); Node coreInterval = inclinationType.getNextSibling(); assertEquals("106.0", coreInterval.getFirstChild().getFirstChild().getFirstChild() .getNodeValue()); assertEquals("249.0", coreInterval.getFirstChild().getFirstChild().getNextSibling() .getFirstChild().getNodeValue()); Node coreCustodian = coreInterval.getNextSibling(); assertEquals("CSIRONR", coreCustodian.getAttributes().getNamedItem("xlink:title") .getNodeValue()); validateGet(path); } /** * Test the gmsl:PlanarOrientation is encoded in the order of aziumth, convention, dip, polarity * according to the schema CGI_Value.xsd * */ @Test public void testPropertyEncodingOrder_PlanarOrientation() throws Exception { String path = "wfs?request=GetFeature&version=1.1.0&typename=er:MineralOccurrence"; Document doc = getAsDOM(path); LOGGER.info("WFS GetFeature&er:MineralOccurrence:\n" + prettyString(doc)); assertXpathCount(1, "//er:MineralOccurrence[@gml:id='er.mineraloccurrence.S0032895']", doc); Node feature = doc.getElementsByTagName("er:MineralOccurrence").item(0); assertEquals("er:MineralOccurrence", feature.getNodeName()); // check for gml:id assertXpathEvaluatesTo("er.mineraloccurrence.S0032895", "//er:MineralOccurrence/@gml:id", doc); Node name = feature.getFirstChild(); assertEquals("gml:name", name.getNodeName()); assertXpathEvaluatesTo("Robinson Range - Deposit D", "//er:MineralOccurrence[@gml:id='er.mineraloccurrence.S0032895']/gml:name", doc); // er:planarOrientation Node planarOrientation = name.getNextSibling(); assertEquals("er:planarOrientation", planarOrientation.getNodeName()); // gsml:CGI_PlanarOrientation Node gsml_planarOrientation = planarOrientation.getFirstChild(); assertEquals("gsml:CGI_PlanarOrientation", gsml_planarOrientation.getNodeName()); // convention Node convention = gsml_planarOrientation.getFirstChild(); assertEquals("gsml:convention", convention.getNodeName()); assertXpathEvaluatesTo( "strike dip right hand rule", "//er:MineralOccurrence[@gml:id='er.mineraloccurrence.S0032895']/er:planarOrientation/gsml:CGI_PlanarOrientation/gsml:convention", doc); // azimuth Node azimuth = convention.getNextSibling(); assertEquals("gsml:azimuth", azimuth.getNodeName()); assertXpathEvaluatesTo( "50.0", "//er:MineralOccurrence[@gml:id='er.mineraloccurrence.S0032895']/er:planarOrientation/gsml:CGI_PlanarOrientation/gsml:azimuth/gsml:CGI_NumericValue/gsml:principalValue", doc); // dip Node dip = azimuth.getNextSibling(); assertEquals("gsml:dip", dip.getNodeName()); assertXpathEvaluatesTo( "60-80", "//er:MineralOccurrence[@gml:id='er.mineraloccurrence.S0032895']/er:planarOrientation/gsml:CGI_PlanarOrientation/gsml:dip/gsml:CGI_TermValue/gsml:value", doc); // polarity Node polarity = dip.getNextSibling(); assertEquals("gsml:polarity", polarity.getNodeName()); assertXpathEvaluatesTo( "not applicable", "//er:MineralOccurrence[@gml:id='er.mineraloccurrence.S0032895']/er:planarOrientation/gsml:CGI_PlanarOrientation/gsml:polarity", doc); // FIXME: this feature type is not yet complete // validateGet(path); } /** * * Test elements are encoded in the order as defined in the schema GeologicUnit is tested here * */ @Test public void testPropertyEncodingOrder_GeologicUnit() throws Exception { WFSInfo wfs = getGeoServer().getService(WFSInfo.class); wfs.setEncodeFeatureMember(true); getGeoServer().save(wfs); String path = "wfs?request=GetFeature&version=1.1.0&typename=gsml:GeologicUnit&featureid=gu.25699"; Document doc = getAsDOM(path); LOGGER.info("WFS GetFeature&typename=gsml:GeologicUnit&featureid=gu.25699:\n" + prettyString(doc)); assertEquals(1, doc.getElementsByTagName("gml:featureMember").getLength()); assertXpathCount(1, "//gsml:GeologicUnit[@gml:id='gu.25699']", doc); // GeologicUnit Node feature = doc.getElementsByTagName("gsml:GeologicUnit").item(0); assertEquals("gsml:GeologicUnit", feature.getNodeName()); // description Node description = feature.getFirstChild(); assertEquals("gml:description", description.getNodeName()); assertXpathEvaluatesTo("Olivine basalt, tuff, microgabbro, minor sedimentary rocks", "//gsml:GeologicUnit[@gml:id='gu.25699']/gml:description", doc); // name1 Node name1 = description.getNextSibling(); assertEquals("gml:name", name1.getNodeName()); assertXpathEvaluatesTo("Yaugher Volcanic Group", "//gsml:GeologicUnit[@gml:id='gu.25699']/gml:name[1]", doc); // name2 Node name2 = name1.getNextSibling(); assertEquals("gml:name", name2.getNodeName()); assertXpathEvaluatesTo("-Py", "//gsml:GeologicUnit[@gml:id='gu.25699']/gml:name[2]", doc); // observationMethod Node observationMethod = name2.getNextSibling(); assertEquals("gsml:observationMethod", observationMethod.getNodeName()); assertXpathEvaluatesTo( "urn:ogc:def:nil:OGC::missing", "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:observationMethod/gsml:CGI_TermValue/gsml:value", doc); assertXpathEvaluatesTo( "http://urn.opengis.net", "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:observationMethod/gsml:CGI_TermValue/gsml:value/@codeSpace", doc); // purpose Node purpose = observationMethod.getNextSibling(); assertEquals("gsml:purpose", purpose.getNodeName()); assertXpathEvaluatesTo("instance", "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:purpose", doc); // occurrence Node occurrence = purpose.getNextSibling(); assertEquals("gsml:occurrence", occurrence.getNodeName()); assertXpathCount( 1, "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:occurrence[@xlink:href='urn:cgi:feature:MappedFeature:mf1']", doc); // geologicUnitType Node geologicUnitType = occurrence.getNextSibling(); assertEquals("gsml:geologicUnitType", geologicUnitType.getNodeName()); assertXpathEvaluatesTo("urn:ogc:def:nil:OGC::unknown", "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:geologicUnitType/@xlink:href", doc); // exposureColor Node exposureColor = geologicUnitType.getNextSibling(); assertEquals("gsml:exposureColor", exposureColor.getNodeName()); assertXpathEvaluatesTo( "Blue", "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:exposureColor/gsml:CGI_TermValue/gsml:value", doc); // outcropCharacter Node outcropCharacter = exposureColor.getNextSibling(); assertEquals("gsml:outcropCharacter", outcropCharacter.getNodeName()); assertXpathEvaluatesTo( "x", "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:outcropCharacter/gsml:CGI_TermValue/gsml:value", doc); // composition Node composition = outcropCharacter.getNextSibling(); assertEquals("gsml:composition", composition.getNodeName()); Node compositionPart = doc.getElementsByTagName("gsml:CompositionPart").item(0); assertEquals("gsml:CompositionPart", compositionPart.getNodeName()); // role Node role = compositionPart.getFirstChild(); assertEquals("gsml:role", role.getNodeName()); assertXpathEvaluatesTo( "fictitious component", "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:composition/gsml:CompositionPart/gsml:role", doc); // lithology Node lithology = role.getNextSibling(); assertEquals("gsml:lithology", lithology.getNodeName()); assertXpathEvaluatesTo("urn:ogc:def:nil:OGC::missing", "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:composition/gsml:CompositionPart/gsml:lithology" + "/gsml:ControlledConcept/gsml:vocabulary/@xlink:href", doc); // proportion Node proportion = lithology.getNextSibling(); assertEquals("gsml:proportion", proportion.getNodeName()); assertXpathEvaluatesTo("nonexistent", "//gsml:GeologicUnit[@gml:id='gu.25699']/gsml:composition/gsml:CompositionPart/gsml:proportion" + "/gsml:CGI_TermValue/gsml:value", doc); validateGet(path); } }