/* (c) 2014 - 2015 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 static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.HashMap;
import java.util.Map;
import org.geoserver.csw.kvp.GetRecordByIdKvpRequestReader;
import org.geoserver.csw.xml.v2_0_2.CSWXmlReader;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.ServiceException;
import org.geoserver.util.EntityResolverProvider;
import org.geotools.csw.CSWConfiguration;
import org.geotools.xml.PreventLocalEntityResolver;
import org.junit.Test;
import org.w3c.dom.Document;
import net.opengis.cat.csw20.ElementSetType;
import net.opengis.cat.csw20.GetRecordByIdType;
/**
*
* @author Niels Charlier
*
*/
public class GetRecordByIdTest extends CSWSimpleTestSupport {
@Test
public void testKVPReader() throws Exception {
Map<String, Object> raw = new HashMap<String, Object>();
raw.put("service", "CSW");
raw.put("version", "2.0.2");
raw.put("request", "GetRecordById");
raw.put("elementsetname", "summary");
raw.put("id", "REC-10,REC-11,REC-12");
raw.put("outputFormat", "application/xml");
raw.put("outputSchema", "http://www.opengis.net/cat/csw/2.0.2");
GetRecordByIdKvpRequestReader reader = new GetRecordByIdKvpRequestReader();
Object request = reader.createRequest();
GetRecordByIdType dr = (GetRecordByIdType) reader.read(request, parseKvp(raw), raw);
assertGetRecordByIdValid(dr);
}
private void assertGetRecordByIdValid(GetRecordByIdType dr) {
assertEquals("CSW", dr.getService());
assertEquals("2.0.2", dr.getVersion());
assertEquals(ElementSetType.SUMMARY, dr.getElementSetName().getValue());
assertEquals("REC-10", dr.getId().get(0).toString());
assertEquals("REC-11", dr.getId().get(1).toString());
assertEquals("REC-12", dr.getId().get(2).toString());
}
@Test
public void testXMLReader() throws Exception {
CSWXmlReader reader = new CSWXmlReader("GetRecordById", "2.0.2", new CSWConfiguration(),
EntityResolverProvider.RESOLVE_DISABLED_PROVIDER);
GetRecordByIdType dr = (GetRecordByIdType) reader.read(null, getResourceAsReader("GetRecordById.xml"), (Map) null);
assertGetRecordByIdValid(dr);
}
@Test
public void testEntityExpansion() throws Exception {
CSWXmlReader reader = new CSWXmlReader("GetRecordById", "2.0.2", new CSWConfiguration(),
GeoServerExtensions.bean(EntityResolverProvider.class));
try {
GetRecordByIdType dr = (GetRecordByIdType) reader.read(null,
getResourceAsReader("GetRecordByIdEntityExpansion.xml"), (Map) null);
fail("Should have failed with an entity expansion disallowed exception");
} catch (ServiceException e) {
Throwable cause = e.getCause();
assertTrue(cause.getMessage().contains(PreventLocalEntityResolver.ERROR_MESSAGE_BASE));
}
}
@Test
public void testGetMissingId() throws Exception {
Document dom = getAsDOM(BASEPATH + "?service=csw&version=2.0.2&request=GetRecordById");
checkOws10Exception(dom, ServiceException.MISSING_PARAMETER_VALUE, "id");
}
@Test
public void testGetSingle() throws Exception {
Document dom = getAsDOM(BASEPATH + "?service=csw&version=2.0.2&request=GetRecordById&elementsetname=summary&id=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f");
// print(dom);
checkValidationErrors(dom);
// check we have the expected results
assertXpathEvaluatesTo("1", "count(//csw:SummaryRecord/dc:identifier)", dom);
assertXpathEvaluatesTo("urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f", "//csw:SummaryRecord/dc:identifier", dom);
assertXpathEvaluatesTo("Lorem ipsum", "//csw:SummaryRecord/dc:title", dom);
assertXpathEvaluatesTo("http://purl.org/dc/dcmitype/Image", "//csw:SummaryRecord/dc:type", dom);
assertXpathEvaluatesTo("Tourism--Greece", "//csw:SummaryRecord/dc:subject", dom);
assertXpathEvaluatesTo("image/svg+xml", "//csw:SummaryRecord/dc:format", dom);
assertXpathEvaluatesTo("Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.", "//csw:SummaryRecord/dct:abstract", dom);
assertXpathEvaluatesTo("GR-22", "//csw:SummaryRecord/dct:spatial", dom);
}
@Test
public void testGetMultiple() throws Exception {
Document dom = getAsDOM(BASEPATH + "?service=csw&version=2.0.2&request=GetRecordById&elementsetname=summary&id=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f,urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd");
// print(dom);
checkValidationErrors(dom);
// check we have the expected results
assertXpathEvaluatesTo("2", "count(//csw:SummaryRecord/dc:identifier)", dom);
assertXpathEvaluatesTo("1", "count(//csw:SummaryRecord[dc:identifier='urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f'])", dom);
assertXpathEvaluatesTo("1", "count(//csw:SummaryRecord[dc:identifier='urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd'])", dom);
assertXpathEvaluatesTo("http://purl.org/dc/dcmitype/Service", "//csw:SummaryRecord[dc:identifier='urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd']/dc:type", dom);
assertXpathEvaluatesTo("Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.", "//csw:SummaryRecord[dc:identifier='urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd']/dct:abstract", dom);
}
@Test
public void testGetNothing() throws Exception {
Document dom = getAsDOM(BASEPATH + "?service=csw&version=2.0.2&request=GetRecordById&elementsetname=summary&id=REC-1,REC-2");
// print(dom);
checkValidationErrors(dom);
// check we have the expected results
assertXpathEvaluatesTo("0", "count(//csw:SummaryRecord)", dom);
}
@Test
public void testGetFull() throws Exception {
Document dom = getAsDOM(BASEPATH + "?service=csw&version=2.0.2&request=GetRecordById&elementsetname=full&id=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f");
// print(dom);
checkValidationErrors(dom);
// check we have the expected results
assertXpathEvaluatesTo("urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f", "//csw:Record/dc:identifier", dom);
assertXpathEvaluatesTo("Lorem ipsum", "//csw:Record/dc:title", dom);
assertXpathEvaluatesTo("http://purl.org/dc/dcmitype/Image", "//csw:Record/dc:type", dom);
assertXpathEvaluatesTo("Tourism--Greece", "//csw:Record/dc:subject", dom);
assertXpathEvaluatesTo("image/svg+xml", "//csw:Record/dc:format", dom);
assertXpathEvaluatesTo("Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.", "//csw:Record/dct:abstract", dom);
assertXpathEvaluatesTo("GR-22", "//csw:Record/dct:spatial", dom);
}
@Test
public void testGetBrief() throws Exception {
Document dom = getAsDOM(BASEPATH + "?service=csw&version=2.0.2&request=GetRecordById&elementsetname=brief&id=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f");
// print(dom);
checkValidationErrors(dom);
// check we have the expected results
assertXpathEvaluatesTo("1", "count(//csw:BriefRecord/dc:identifier)", dom);
assertXpathEvaluatesTo("urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f", "//csw:BriefRecord/dc:identifier", dom);
assertXpathEvaluatesTo("Lorem ipsum", "//csw:BriefRecord/dc:title", dom);
assertXpathEvaluatesTo("http://purl.org/dc/dcmitype/Image", "//csw:BriefRecord/dc:type", dom);
assertXpathEvaluatesTo("", "//csw:BriefRecord/dc:subject", dom);
}
@Test
public void testPostSummary() throws Exception {
String request = getResourceAsString("GetRecordById.xml");
request = request.replace("REC-10", "urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f");
Document dom = postAsDOM(BASEPATH, request);
print(dom);
checkValidationErrors(dom);
// check we have the expected results
assertXpathEvaluatesTo("urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f", "//csw:SummaryRecord/dc:identifier", dom);
assertXpathEvaluatesTo("Lorem ipsum", "//csw:SummaryRecord/dc:title", dom);
assertXpathEvaluatesTo("http://purl.org/dc/dcmitype/Image", "//csw:SummaryRecord/dc:type", dom);
assertXpathEvaluatesTo("Tourism--Greece", "//csw:SummaryRecord/dc:subject", dom);
assertXpathEvaluatesTo("image/svg+xml", "//csw:SummaryRecord/dc:format", dom);
assertXpathEvaluatesTo("Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.", "//csw:SummaryRecord/dct:abstract", dom);
assertXpathEvaluatesTo("GR-22", "//csw:SummaryRecord/dct:spatial", dom);
}
}