/* (c) 2014 - 2016 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.csw;
import static junit.framework.Assert.assertEquals;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Map;
import javax.xml.namespace.QName;
import net.opengis.cat.csw20.DescribeRecordType;
import org.apache.commons.io.IOUtils;
import org.geoserver.csw.kvp.DescribeRecordKvpRequestReader;
import org.geoserver.csw.xml.v2_0_2.CSWXmlReader;
import org.geoserver.platform.ServiceException;
import org.geoserver.util.EntityResolverProvider;
import org.geotools.csw.CSWConfiguration;
import org.junit.Test;
import org.w3c.dom.Document;
import org.springframework.mock.web.MockHttpServletResponse;
public class DescribeRecordTest extends CSWSimpleTestSupport {
@Test
public void testKVPReaderNS() throws Exception {
Map<String, Object> raw = new HashMap<String, Object>();
raw.put("service", "CSW");
raw.put("version", "2.0.2");
raw.put("request", "DescribeRecord");
raw.put("namespace",
"xmlns(csw=http://www.opengis.net/cat/csw/2.0.2),xmlns(rim=urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0)");
raw.put("typename", "csw:Record,rim:RegistryPackage");
raw.put("schemalanguage", "XMLSCHEMA");
raw.put("outputFormat", "application/xml");
DescribeRecordKvpRequestReader reader = new DescribeRecordKvpRequestReader();
Object request = reader.createRequest();
DescribeRecordType dr = (DescribeRecordType) reader.read(request, parseKvp(raw), raw);
assertDescribeRecordValid(dr);
}
private void assertDescribeRecordValid(DescribeRecordType dr) {
assertEquals("CSW", dr.getService());
assertEquals("2.0.2", dr.getVersion());
assertEquals(2, dr.getTypeName().size());
assertEquals(new QName("http://www.opengis.net/cat/csw/2.0.2", "Record"), dr.getTypeName()
.get(0));
assertEquals(new QName("urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0", "RegistryPackage"),
dr.getTypeName().get(1));
}
@Test
public void testKVPReaderNoNamespace() throws Exception {
Map<String, Object> raw = new HashMap<String, Object>();
raw.put("service", "CSW");
raw.put("version", "2.0.2");
raw.put("request", "DescribeRecord");
raw.put("typename", "csw:Record,rim:RegistryPackage");
raw.put("schemalanguage", "XMLSCHEMA");
raw.put("outputFormat", "application/xml");
DescribeRecordKvpRequestReader reader = new DescribeRecordKvpRequestReader();
Object request = reader.createRequest();
DescribeRecordType dr = (DescribeRecordType) reader.read(request, parseKvp(raw), raw);
assertDescribeRecordValid(dr);
}
@Test
public void testKVPReaderDefaultNamespace() throws Exception {
Map<String, Object> raw = new HashMap<String, Object>();
raw.put("service", "CSW");
raw.put("version", "2.0.2");
raw.put("request", "DescribeRecord");
raw.put("namespace",
"xmlns(=http://www.opengis.net/cat/csw/2.0.2),xmlns(rim=urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0)");
raw.put("typename", "Record,rim:RegistryPackage");
raw.put("schemalanguage", "XMLSCHEMA");
raw.put("outputFormat", "application/xml");
DescribeRecordKvpRequestReader reader = new DescribeRecordKvpRequestReader();
Object request = reader.createRequest();
DescribeRecordType dr = (DescribeRecordType) reader.read(request, parseKvp(raw), raw);
assertDescribeRecordValid(dr);
}
@Test
public void testXMLReader() throws Exception {
CSWXmlReader reader = new CSWXmlReader("DescribeRecord", "2.0.2", new CSWConfiguration(),
EntityResolverProvider.RESOLVE_DISABLED_PROVIDER);
DescribeRecordType dr = (DescribeRecordType) reader.read(null,
getResourceAsReader("DescribeRecord.xml"), (Map) null);
assertDescribeRecordValid(dr);
}
// this is one of the CITE tests, unknown type names should just be ignored
@Test
public void testDummyRecord() throws Exception {
Document dom = getAsDOM("csw?service=CSW&version=2.0.2&request=DescribeRecord&typeName=csw:DummyRecord");
checkValidationErrors(dom);
print(dom);
assertXpathEvaluatesTo("1", "count(/csw:DescribeRecordResponse)", dom);
assertXpathEvaluatesTo("0", "count(//csw:SchemaComponent)", dom);
}
@Test
public void testBasicGetLocalSchema() throws Exception {
Document dom = getAsDOM("csw?service=CSW&version=2.0.2&request=DescribeRecord");
checkValidationErrors(dom);
print(dom);
assertCswRecordSchema(dom, false);
// check we can really read those schemas
MockHttpServletResponse response = getAsServletResponse("/schemas/csw/2.0.2/rec-dcterms.xsd");
assertEquals(200, response.getStatus());
dom = dom(new ByteArrayInputStream(response.getContentAsString().getBytes("UTF-8")));
assertXpathEvaluatesTo("dc:SimpleLiteral", "//xs:element[@name='abstract']/@type", dom);
}
@Test
public void testBasicGetCanonicalSchema() throws Exception {
try {
CSWInfo csw = getGeoServer().getService(CSWInfo.class);
csw.setCanonicalSchemaLocation(true);
getGeoServer().save(csw);
Document dom = getAsDOM("csw?service=CSW&version=2.0.2&request=DescribeRecord");
checkValidationErrors(dom);
// print(dom);
assertCswRecordSchema(dom, true);
} finally {
CSWInfo csw = getGeoServer().getService(CSWInfo.class);
csw.setCanonicalSchemaLocation(false);
getGeoServer().save(csw);
}
}
@Test
public void testBasicPost() throws Exception {
String request = IOUtils.toString(getResourceAsReader("DescribeCswRecord.xml"));
Document dom = postAsDOM("csw", request);
checkValidationErrors(dom);
// print(dom);
assertCswRecordSchema(dom, false);
}
private void assertCswRecordSchema(Document dom, boolean canonicalSchema) throws Exception {
// print(dom);
String root = canonicalSchema ? "http://schemas.opengis.net" : "http://localhost:8080/geoserver/schemas";
assertXpathEvaluatesTo("http://www.opengis.net/cat/csw/2.0.2 " + root + "/csw/2.0.2/CSW-discovery.xsd",
"//csw:DescribeRecordResponse/@xsi:schemaLocation", dom);
assertXpathEvaluatesTo("1", "count(//xsd:element[@name = 'BriefRecord'])", dom);
assertXpathEvaluatesTo("1", "count(//xsd:element[@name = 'SummaryRecord'])", dom);
assertXpathEvaluatesTo("1", "count(//xsd:element[@name = 'Record'])", dom);
assertXpathEvaluatesTo(
root + "/csw/2.0.2/rec-dcterms.xsd",
"//xsd:import[@namespace = 'http://purl.org/dc/terms/']/@schemaLocation", dom);
}
@Test
public void testAlternativeNamespacePrefix() throws Exception {
Document dom = getAsDOM("csw?service=CSW&version=2.0.2&request=DescribeRecord&typeName=fuffa:Record&namespace=xmlns(fuffa=http://www.opengis.net/cat/csw/2.0.2)");
assertCswRecordSchema(dom, false);
}
@Test
public void testDefaultNamespacePrefix() throws Exception {
Document dom = getAsDOM("csw?service=CSW&version=2.0.2&request=DescribeRecord&typeName=Record&namespace=xmlns(=http://www.opengis.net/cat/csw/2.0.2)");
// print(dom);
assertCswRecordSchema(dom, false);
}
@Test
public void testMissingOutputFormat() throws Exception {
Document dom = getAsDOM("csw?service=CSW&version=2.0.2&request=DescribeRecord&outputFormat=text/sgml");
checkOws10Exception(dom, ServiceException.INVALID_PARAMETER_VALUE, "outputFormat");
}
@Test
public void testInvalidSchemaLanguage() throws Exception {
Document dom = getAsDOM("csw?service=CSW&version=2.0.2&request=DescribeRecord&schemaLanguage=http://purl.oclc.org/dsdl/schematron");
checkOws10Exception(dom, ServiceException.INVALID_PARAMETER_VALUE, "schemaLanguage");
}
}