/**
*
* geo-platform
* Rich webgis framework
* http://geo-platform.org
* ====================================================================
*
* Copyright (C) 2008-2017 geoSDI Group (CNR IMAA - Potenza - ITALY).
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. This program is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License
* for more details. You should have received a copy of the GNU General
* Public License along with this program. If not, see http://www.gnu.org/licenses/
*
* ====================================================================
*
* Linking this library statically or dynamically with other modules is
* making a combined work based on this library. Thus, the terms and
* conditions of the GNU General Public License cover the whole combination.
*
* As a special exception, the copyright holders of this library give you permission
* to link this library with independent modules to produce an executable, regardless
* of the license terms of these independent modules, and to copy and distribute
* the resulting executable under terms of your choice, provided that you also meet,
* for each linked independent module, the terms and conditions of the license of
* that module. An independent module is a module which is not derived from or
* based on this library. If you modify this library, you may extend this exception
* to your version of the library, but you are not obligated to do so. If you do not
* wish to do so, delete this exception statement from your version.
*/
package org.geosdi.geoplatform.connector;
import java.io.StringWriter;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Scanner;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import org.geosdi.geoplatform.connector.jaxb.repository.CSWConnectorJAXBContext;
import org.geosdi.geoplatform.connector.jaxb.repository.JAXBContextConnectorRepository;
import org.geosdi.geoplatform.jaxb.GPBaseJAXBContext;
import org.geosdi.geoplatform.xml.csw.v202.ElementSetNameType;
import org.geosdi.geoplatform.xml.csw.v202.ElementSetType;
import org.geosdi.geoplatform.xml.csw.v202.GetRecordsType;
import org.geosdi.geoplatform.xml.csw.v202.QueryConstraintType;
import org.geosdi.geoplatform.xml.csw.v202.QueryType;
import org.geosdi.geoplatform.xml.csw.v202.ResultType;
import org.geosdi.geoplatform.xml.filter.v110.BBOXType;
import org.geosdi.geoplatform.xml.filter.v110.BinaryComparisonOpType;
import org.geosdi.geoplatform.xml.filter.v110.BinaryLogicOpType;
import org.geosdi.geoplatform.xml.filter.v110.BinarySpatialOpType;
import org.geosdi.geoplatform.xml.filter.v110.FilterType;
import org.geosdi.geoplatform.xml.filter.v110.LiteralType;
import org.geosdi.geoplatform.xml.filter.v110.PropertyIsLikeType;
import org.geosdi.geoplatform.xml.filter.v110.PropertyNameType;
import org.geosdi.geoplatform.xml.gml.v311.AbstractGeometryType;
import org.geosdi.geoplatform.xml.gml.v311.AbstractRingPropertyType;
import org.geosdi.geoplatform.xml.gml.v311.CoordinatesType;
import org.geosdi.geoplatform.xml.gml.v311.DirectPositionType;
import org.geosdi.geoplatform.xml.gml.v311.EnvelopeType;
import org.geosdi.geoplatform.xml.gml.v311.LinearRingType;
import org.geosdi.geoplatform.xml.gml.v311.PolygonType;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Vincenzo Monteverde <vincenzo.monteverde@geosdi.org>
*/
public class CatalogRequestTest {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
//
private final GPBaseJAXBContext cswContext = JAXBContextConnectorRepository.getProvider(
CSWConnectorJAXBContext.CSW_CONTEXT_KEY);
private org.geosdi.geoplatform.xml.filter.v110.ObjectFactory filterFactory;
private org.geosdi.geoplatform.xml.gml.v311.ObjectFactory gmlFactory;
@Before
public void setUp() {
filterFactory = new org.geosdi.geoplatform.xml.filter.v110.ObjectFactory();
gmlFactory = new org.geosdi.geoplatform.xml.gml.v311.ObjectFactory();
}
@Test
public void testGetRecordsCount() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.HITS);
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("csw:Record")));
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"hits\""));
assertTrue(request.contains("<csw:Query typeNames=\"csw:Record\""));
assertTrue(request.contains("</csw:GetRecords>"));
}
@Test
public void testGetRecordsCountQuery() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.HITS);
getRecords.setOutputSchema("http://www.opengis.net/cat/csw/2.0.2");
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("csw:Record")));
ElementSetNameType elementSetNameType = new ElementSetNameType();
elementSetNameType.setValue(ElementSetType.BRIEF);
query.setElementSetName(elementSetNameType);
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"hits\""));
assertTrue(request.contains("outputSchema=\"http://www.opengis.net/cat/csw/2.0.2\""));
assertTrue(request.contains("<csw:Query typeNames=\"csw:Record\""));
assertTrue(request.contains("<csw:ElementSetName>brief</csw:ElementSetName>"));
assertTrue(request.contains("</csw:Query>"));
assertTrue(request.contains("</csw:GetRecords>"));
}
@Test
public void testGetRecordsSearchFilterTextAnytext() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.RESULTS);
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("gmd:MD_Metadata")));
ElementSetNameType elementSetNameType = new ElementSetNameType();
elementSetNameType.setValue(ElementSetType.SUMMARY);
query.setElementSetName(elementSetNameType);
PropertyIsLikeType propertyIsLikeType = this.createPropertyIsLikeType("AnyText", "%venezia%");
JAXBElement<PropertyIsLikeType> propertyIsLike = filterFactory.createPropertyIsLike(propertyIsLikeType);
FilterType filterType = new FilterType();
filterType.setComparisonOps(propertyIsLike);
QueryConstraintType queryConstraintType = new QueryConstraintType();
queryConstraintType.setVersion("1.1.0");
queryConstraintType.setFilter(filterType);
query.setConstraint(queryConstraintType);
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"results\""));
assertTrue(request.contains("<csw:Query typeNames=\"gmd:MD_Metadata\""));
assertTrue(request.contains("<csw:ElementSetName>summary</csw:ElementSetName>"));
assertTrue(request.contains("<csw:Constraint version=\"1.1.0\">"));
assertTrue(request.contains("<ogc:Filter>"));
assertTrue(request.contains("<ogc:PropertyIsLike wildCard=\"%\" singleChar=\".\" escapeChar=\"\\\">"));
assertTrue(request.contains("<ogc:PropertyName>AnyText</ogc:PropertyName>"));
assertTrue(request.contains("<ogc:Literal>%venezia%</ogc:Literal>"));
assertTrue(request.contains("</ogc:PropertyIsLike>"));
assertTrue(request.contains("</ogc:Filter>"));
assertTrue(request.contains("</csw:Constraint>"));
assertTrue(request.contains("</csw:Query>"));
assertTrue(request.contains("</csw:GetRecords>"));
}
@Test
public void testGetRecordsSearchFilterTextTitleOrAbstract() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.RESULTS);
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("gmd:MD_Metadata")));
ElementSetNameType elementSetNameType = new ElementSetNameType();
elementSetNameType.setValue(ElementSetType.SUMMARY);
query.setElementSetName(elementSetNameType);
PropertyIsLikeType titleIsLikeType = this.createPropertyIsLikeType("dc:title", "%limiti%");
PropertyIsLikeType abstractIsLikeType = this.createPropertyIsLikeType("dc:abstract", "%italia%");
List<JAXBElement<?>> propertyList = new ArrayList<JAXBElement<?>>(2);
propertyList.add(filterFactory.createPropertyIsLike(titleIsLikeType));
propertyList.add(filterFactory.createPropertyIsLike(abstractIsLikeType));
BinaryLogicOpType binary = new BinaryLogicOpType();
binary.setComparisonOpsOrSpatialOpsOrLogicOps(propertyList);
JAXBElement<BinaryLogicOpType> orType = filterFactory.createOr(binary);
FilterType filterType = new FilterType();
filterType.setLogicOps(orType);
QueryConstraintType queryConstraintType = new QueryConstraintType();
queryConstraintType.setVersion("1.1.0");
queryConstraintType.setFilter(filterType);
query.setConstraint(queryConstraintType);
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"results\""));
assertTrue(request.contains("<csw:Query typeNames=\"gmd:MD_Metadata\""));
assertTrue(request.contains("<csw:ElementSetName>summary</csw:ElementSetName>"));
assertTrue(request.contains("<csw:Constraint version=\"1.1.0\">"));
assertTrue(request.contains("<ogc:Filter>"));
assertTrue(request.contains("<ogc:Or>"));
assertTrue(request.contains("<ogc:PropertyIsLike wildCard=\"%\" singleChar=\".\" escapeChar=\"\\\">"));
assertTrue(request.contains("<ogc:PropertyName>dc:title</ogc:PropertyName>"));
assertTrue(request.contains("<ogc:Literal>%limiti%</ogc:Literal>"));
assertTrue(request.contains("</ogc:PropertyIsLike>"));
assertTrue(request.contains("<ogc:PropertyIsLike wildCard=\"%\" singleChar=\".\" escapeChar=\"\\\">"));
assertTrue(request.contains("<ogc:PropertyName>dc:abstract</ogc:PropertyName>"));
assertTrue(request.contains("<ogc:Literal>%italia%</ogc:Literal>"));
assertTrue(request.contains("</ogc:PropertyIsLike>"));
assertTrue(request.contains("</ogc:Or>"));
assertTrue(request.contains("</ogc:Filter>"));
assertTrue(request.contains("</csw:Constraint>"));
assertTrue(request.contains("</csw:Query>"));
assertTrue(request.contains("</csw:GetRecords>"));
}
@Test
public void testGetRecordsSearchFilterTextTitleOrSubject() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.RESULTS);
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("gmd:MD_Metadata")));
ElementSetNameType elementSetNameType = new ElementSetNameType();
elementSetNameType.setValue(ElementSetType.SUMMARY);
query.setElementSetName(elementSetNameType);
PropertyIsLikeType titleIsLikeType = this.createPropertyIsLikeType("dc:title", "%limiti%");
BinaryComparisonOpType subjectIsEqualTo = this.createBinaryComparisonOpType("dc:subject", "GEOSERVER");
List<JAXBElement<?>> propertyList = new ArrayList<JAXBElement<?>>(2);
propertyList.add(filterFactory.createPropertyIsLike(titleIsLikeType));
propertyList.add(filterFactory.createPropertyIsEqualTo(subjectIsEqualTo));
BinaryLogicOpType binary = new BinaryLogicOpType();
binary.setComparisonOpsOrSpatialOpsOrLogicOps(propertyList);
FilterType filterType = new FilterType();
filterType.setLogicOps(filterFactory.createOr(binary));
QueryConstraintType queryConstraintType = new QueryConstraintType();
queryConstraintType.setVersion("1.1.0");
queryConstraintType.setFilter(filterType);
query.setConstraint(queryConstraintType);
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"results\""));
assertTrue(request.contains("<csw:Query typeNames=\"gmd:MD_Metadata\""));
assertTrue(request.contains("<csw:ElementSetName>summary</csw:ElementSetName>"));
assertTrue(request.contains("<csw:Constraint version=\"1.1.0\">"));
assertTrue(request.contains("<ogc:Filter>"));
assertTrue(request.contains("<ogc:Or>"));
assertTrue(request.contains("<ogc:PropertyIsLike wildCard=\"%\" singleChar=\".\" escapeChar=\"\\\">"));
assertTrue(request.contains("<ogc:PropertyName>dc:title</ogc:PropertyName>"));
assertTrue(request.contains("<ogc:Literal>%limiti%</ogc:Literal>"));
assertTrue(request.contains("</ogc:PropertyIsLike>"));
assertTrue(request.contains("<ogc:PropertyIsEqualTo>"));
assertTrue(request.contains("<ogc:PropertyName>dc:subject</ogc:PropertyName>"));
assertTrue(request.contains("<ogc:Literal>GEOSERVER</ogc:Literal>"));
assertTrue(request.contains("</ogc:PropertyIsEqualTo>"));
assertTrue(request.contains("</ogc:Or>"));
assertTrue(request.contains("</ogc:Filter>"));
assertTrue(request.contains("</csw:Constraint>"));
assertTrue(request.contains("</csw:Query>"));
assertTrue(request.contains("</csw:GetRecords>"));
}
@Test
public void testGetRecordsSearchFilterAreaBBox() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.RESULTS);
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("gmd:MD_Metadata")));
ElementSetNameType elementSetNameType = new ElementSetNameType();
elementSetNameType.setValue(ElementSetType.SUMMARY);
query.setElementSetName(elementSetNameType);
BBOXType bbox = new BBOXType();
PropertyNameType propertyNameType = new PropertyNameType();
propertyNameType.setContent(Arrays.<Object>asList("ows:BoundingBox"));
bbox.setPropertyName(propertyNameType);
EnvelopeType envelope = this.createEnvelopeItaly();
bbox.setEnvelope(gmlFactory.createEnvelope(envelope));
FilterType filterType = new FilterType();
filterType.setSpatialOps(filterFactory.createBBOX(bbox));
QueryConstraintType queryConstraintType = new QueryConstraintType();
queryConstraintType.setVersion("1.1.0");
queryConstraintType.setFilter(filterType);
query.setConstraint(queryConstraintType);
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"results\""));
assertTrue(request.contains("<csw:Query typeNames=\"gmd:MD_Metadata\""));
assertTrue(request.contains("<csw:ElementSetName>summary</csw:ElementSetName>"));
assertTrue(request.contains("<csw:Constraint version=\"1.1.0\">"));
assertTrue(request.contains("<ogc:Filter>"));
assertTrue(request.contains("<ogc:BBOX>"));
assertTrue(request.contains("<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>"));
assertTrue(request.contains("<gml:Envelope>"));
assertTrue(request.contains("<gml:lowerCorner>6.624 36.6492</gml:lowerCorner>"));
assertTrue(request.contains("<gml:upperCorner>18.5144 47.0946</gml:upperCorner>"));
assertTrue(request.contains("</gml:Envelope>"));
assertTrue(request.contains("</ogc:BBOX>"));
assertTrue(request.contains("</ogc:Filter>"));
assertTrue(request.contains("</csw:Constraint>"));
assertTrue(request.contains("</csw:Query>"));
assertTrue(request.contains("</csw:GetRecords>"));
}
@Test
public void testGetRecordsSearchFilterAreaEnclosesEnvelope() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.RESULTS);
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("gmd:MD_Metadata")));
ElementSetNameType elementSetNameType = new ElementSetNameType();
elementSetNameType.setValue(ElementSetType.SUMMARY);
query.setElementSetName(elementSetNameType);
BinarySpatialOpType binarySpatial = new BinarySpatialOpType();
PropertyNameType propertyNameType = new PropertyNameType();
propertyNameType.setContent(Arrays.<Object>asList("ows:BoundingBox"));
binarySpatial.setPropertyName(propertyNameType);
EnvelopeType envelope = this.createEnvelopeItaly();
binarySpatial.setEnvelope(gmlFactory.createEnvelope(envelope));
FilterType filterType = new FilterType();
filterType.setSpatialOps(filterFactory.createContains(binarySpatial));
QueryConstraintType queryConstraintType = new QueryConstraintType();
queryConstraintType.setVersion("1.1.0");
queryConstraintType.setFilter(filterType);
query.setConstraint(queryConstraintType);
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"results\""));
assertTrue(request.contains("<csw:Query typeNames=\"gmd:MD_Metadata\""));
assertTrue(request.contains("<csw:ElementSetName>summary</csw:ElementSetName>"));
assertTrue(request.contains("<csw:Constraint version=\"1.1.0\">"));
assertTrue(request.contains("<ogc:Filter>"));
assertTrue(request.contains("<ogc:Contains>"));
assertTrue(request.contains("<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>"));
assertTrue(request.contains("<gml:Envelope>"));
assertTrue(request.contains("<gml:lowerCorner>6.624 36.6492</gml:lowerCorner>"));
assertTrue(request.contains("<gml:upperCorner>18.5144 47.0946</gml:upperCorner>"));
assertTrue(request.contains("</gml:Envelope>"));
assertTrue(request.contains("</ogc:Contains>"));
assertTrue(request.contains("</ogc:Filter>"));
assertTrue(request.contains("</csw:Constraint>"));
assertTrue(request.contains("</csw:Query>"));
assertTrue(request.contains("</csw:GetRecords>"));
}
@Test
public void testGetRecordsSearchFilterAreaEnclosesPolygon() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.RESULTS);
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("gmd:MD_Metadata")));
ElementSetNameType elementSetNameType = new ElementSetNameType();
elementSetNameType.setValue(ElementSetType.SUMMARY);
query.setElementSetName(elementSetNameType);
BinarySpatialOpType binarySpatial = new BinarySpatialOpType();
PropertyNameType propertyNameType = new PropertyNameType();
propertyNameType.setContent(Arrays.<Object>asList("ows:BoundingBox"));
binarySpatial.setPropertyName(propertyNameType);
CoordinatesType coordinatesType = new CoordinatesType();
// The first and last point must be the same
// minX minY maxX maxY minX
coordinatesType.setValue("6.624 36.6492 18.5144 47.0946 6.624");
// OR
// minX,minY maxX,minY maxX,maxY minX,maxY
// coordinatesType.setValue("6.624,36.6492 18.5144,36.6492 18.5144,47.0946 6.624,47.0946 6.624,36.6492");
LinearRingType linearRing = new LinearRingType();
linearRing.setCoordinates(coordinatesType);
AbstractRingPropertyType abstractRing = new AbstractRingPropertyType();
abstractRing.setRing(gmlFactory.createLinearRing(linearRing));
PolygonType polygon = new PolygonType();
polygon.setSrsName("EPSG:4326");
polygon.setExterior(gmlFactory.createExterior(abstractRing));
JAXBElement<? extends AbstractGeometryType> polygonElement = gmlFactory.createPolygon(polygon);
binarySpatial.setGeometry((JAXBElement<AbstractGeometryType>) polygonElement);
FilterType filterType = new FilterType();
filterType.setSpatialOps(filterFactory.createContains(binarySpatial));
QueryConstraintType queryConstraintType = new QueryConstraintType();
queryConstraintType.setVersion("1.1.0");
queryConstraintType.setFilter(filterType);
query.setConstraint(queryConstraintType);
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"results\""));
assertTrue(request.contains("<csw:Query typeNames=\"gmd:MD_Metadata\""));
assertTrue(request.contains("<csw:ElementSetName>summary</csw:ElementSetName>"));
assertTrue(request.contains("<csw:Constraint version=\"1.1.0\">"));
assertTrue(request.contains("<ogc:Filter>"));
assertTrue(request.contains("<ogc:Contains>"));
assertTrue(request.contains("<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>"));
assertTrue(request.contains("<gml:Polygon srsName=\"EPSG:4326\">"));
assertTrue(request.contains("<gml:exterior>"));
assertTrue(request.contains("<gml:LinearRing>"));
assertTrue(request.contains("<gml:coordinates>6.624 36.6492 18.5144 47.0946 6.624</gml:coordinates>"));
assertTrue(request.contains("</gml:LinearRing>"));
assertTrue(request.contains("</gml:exterior>"));
assertTrue(request.contains("</gml:Polygon>"));
assertTrue(request.contains("</ogc:Contains>"));
assertTrue(request.contains("</ogc:Filter>"));
assertTrue(request.contains("</csw:Constraint>"));
assertTrue(request.contains("</csw:Query>"));
assertTrue(request.contains("</csw:GetRecords>"));
}
@Test
public void testGetRecordsSearchFilterTemporal() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.RESULTS);
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("gmd:MD_Metadata")));
ElementSetNameType elementSetNameType = new ElementSetNameType();
elementSetNameType.setValue(ElementSetType.SUMMARY);
query.setElementSetName(elementSetNameType);
BinaryComparisonOpType begin = this.createBinaryComparisonOpType(
"TempExtent_begin", "2000-01-01T00:00:00Z");
BinaryComparisonOpType end = this.createBinaryComparisonOpType(
"TempExtent_end", "2012-01-01T00:00:00Z");
List<JAXBElement<?>> propertyList = new ArrayList<JAXBElement<?>>(2);
propertyList.add(filterFactory.createPropertyIsGreaterThanOrEqualTo(begin));
propertyList.add(filterFactory.createPropertyIsLessThanOrEqualTo(end));
BinaryLogicOpType binary = new BinaryLogicOpType();
binary.setComparisonOpsOrSpatialOpsOrLogicOps(propertyList);
FilterType filterType = new FilterType();
filterType.setLogicOps(filterFactory.createAnd(binary));
QueryConstraintType queryConstraintType = new QueryConstraintType();
queryConstraintType.setVersion("1.1.0");
queryConstraintType.setFilter(filterType);
query.setConstraint(queryConstraintType);
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"results\""));
assertTrue(request.contains("<csw:Query typeNames=\"gmd:MD_Metadata\""));
assertTrue(request.contains("<csw:ElementSetName>summary</csw:ElementSetName>"));
assertTrue(request.contains("<csw:Constraint version=\"1.1.0\">"));
assertTrue(request.contains("<ogc:Filter>"));
assertTrue(request.contains("<ogc:And>"));
assertTrue(request.contains("<ogc:PropertyIsGreaterThanOrEqualTo>"));
assertTrue(request.contains("<ogc:PropertyName>TempExtent_begin</ogc:PropertyName>"));
assertTrue(request.contains("<ogc:Literal>2000-01-01T00:00:00Z</ogc:Literal>"));
assertTrue(request.contains("</ogc:PropertyIsGreaterThanOrEqualTo>"));
assertTrue(request.contains("<ogc:PropertyIsLessThanOrEqualTo>"));
assertTrue(request.contains("<ogc:PropertyName>TempExtent_end</ogc:PropertyName>"));
assertTrue(request.contains("<ogc:Literal>2012-01-01T00:00:00Z</ogc:Literal>"));
assertTrue(request.contains("</ogc:PropertyIsLessThanOrEqualTo>"));
assertTrue(request.contains("</ogc:And>"));
assertTrue(request.contains("</ogc:Filter>"));
assertTrue(request.contains("</csw:Constraint>"));
assertTrue(request.contains("</csw:Query>"));
assertTrue(request.contains("</csw:GetRecords>"));
}
@Test
public void testGetRecordsSearchCQL() throws Exception {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setResultType(ResultType.RESULTS);
getRecords.setStartPosition(BigInteger.ONE);
getRecords.setMaxRecords(BigInteger.TEN);
getRecords.setOutputSchema("http://www.opengis.net/cat/csw/2.0.2");
QueryType query = new QueryType();
getRecords.setAbstractQuery(query);
query.setTypeNames(Arrays.asList(QName.valueOf("gmd:MD_Metadata")));
ElementSetNameType elementSetNameType = new ElementSetNameType();
elementSetNameType.setValue(ElementSetType.FULL);
query.setElementSetName(elementSetNameType);
QueryConstraintType queryConstraintType = new QueryConstraintType();
queryConstraintType.setVersion("1.1.0");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Calendar startCalendar = new GregorianCalendar(2000, Calendar.JANUARY, 1);
Calendar endCalendar = new GregorianCalendar(2012, Calendar.JANUARY, 1);
StringBuilder constraint = new StringBuilder();
constraint.append("AnyText LIKE '%venezia%'");
constraint.append(" AND ");
constraint.append("TempExtent_begin AFTER ").append(formatter.format(startCalendar.getTime()));
constraint.append(" AND ");
constraint.append("TempExtent_end BEFORE ").append(formatter.format(endCalendar.getTime()));
queryConstraintType.setCqlText(constraint.toString());
query.setConstraint(queryConstraintType);
Marshaller marshaller = cswContext.acquireMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(getRecords, writer);
String request = writer.toString();
logger.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n{}",
new Scanner(request).useDelimiter("\\A").next());
assertTrue(request.contains("<csw:GetRecords"));
assertTrue(request.contains("service=\"CSW\""));
assertTrue(request.contains("version=\"2.0.2\""));
assertTrue(request.contains("resultType=\"results\""));
assertTrue(request.contains("outputSchema=\"http://www.opengis.net/cat/csw/2.0.2\""));
assertTrue(request.contains("startPosition=\"1\""));
assertTrue(request.contains("maxRecords=\"10\""));
assertTrue(request.contains("<csw:Query typeNames=\"gmd:MD_Metadata\""));
assertTrue(request.contains("<csw:ElementSetName>full</csw:ElementSetName>"));
assertTrue(request.contains("<csw:Constraint version=\"1.1.0\">"));
assertTrue(request.contains("<csw:CqlText>AnyText LIKE '%venezia%' "
+ "AND TempExtent_begin AFTER 2000-01-01T00:00:00Z "
+ "AND TempExtent_end BEFORE 2012-01-01T00:00:00Z</csw:CqlText>"));
assertTrue(request.contains("</csw:Constraint>"));
assertTrue(request.contains("</csw:Query>"));
assertTrue(request.contains("</csw:GetRecords>"));
}
private PropertyIsLikeType createPropertyIsLikeType(String propertyName, String literal) {
PropertyIsLikeType propertyIsLikeType = new PropertyIsLikeType();
propertyIsLikeType.setWildCard("%");
propertyIsLikeType.setSingleChar(".");
propertyIsLikeType.setEscapeChar("\\");
PropertyNameType propertyNameType = new PropertyNameType();
propertyNameType.setContent(Arrays.<Object>asList(propertyName));
propertyIsLikeType.setPropertyName(propertyNameType);
LiteralType literalType = new LiteralType();
literalType.setContent(Arrays.<Object>asList(literal));
propertyIsLikeType.setLiteral(literalType);
return propertyIsLikeType;
}
private BinaryComparisonOpType createBinaryComparisonOpType(String propertyName, String literal) {
BinaryComparisonOpType binaryComparison = new BinaryComparisonOpType();
PropertyNameType propertyNameType = new PropertyNameType();
propertyNameType.setContent(Arrays.<Object>asList(propertyName));
LiteralType literalType = new LiteralType();
literalType.setContent(Arrays.<Object>asList(literal));
List<JAXBElement<?>> expressionList = new ArrayList<JAXBElement<?>>(2);
expressionList.add(filterFactory.createPropertyName(propertyNameType));
expressionList.add(filterFactory.createLiteral(literalType));
binaryComparison.setExpression(expressionList);
return binaryComparison;
}
private EnvelopeType createEnvelopeItaly() {
EnvelopeType envelope = new EnvelopeType();
DirectPositionType lower = new DirectPositionType();
lower.setValue(Arrays.asList(6.624, 36.6492)); // minX, minY
envelope.setLowerCorner(lower);
DirectPositionType upper = new DirectPositionType();
upper.setValue(Arrays.asList(18.5144, 47.0946)); // maxX, maxY
envelope.setUpperCorner(upper);
return envelope;
}
}