use of org.geotoolkit.ogc.xml.v110.SortByType in project ddf by codice.
the class WfsSourceTest method testSortingDescendingSortingSupported.
/**
* Verify that the SortBy is set with the mapped Feature Property and a DESC sort order. In this
* case, the incoming sort property of TEMPORAL is mapped to myTemporalFeatureProperty.
*
* <p><?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns5:GetFeature startIndex="1"
* count="1" service="WFS" version="2.0.0" xmlns:ns2="http://www.opengis.net/ows/1.1"
* xmlns="http://www.opengis.net/fes/2.0" xmlns:ns4="http://www.opengis.net/gml"
* xmlns:ns3="http://www.w3.org/1999/xlink" xmlns:ns5="http://www.opengis.net/wfs/2.0"> <ns5:Query
* typeNames="SampleFeature0" handle="SampleFeature0"> <Filter> <PropertyIsLike wildCard="*"
* singleChar="?" escapeChar="!"> <Literal>*</Literal> <ValueReference>title</ValueReference>
* </PropertyIsLike> </Filter> <SortBy> <SortProperty>
* <ValueReference>myTemporalFeatureProperty</ValueReference> <SortOrder>DESC</SortOrder>
* </SortProperty> </SortBy> </ns5:Query> </ns5:GetFeature>
*/
@Test
public void testSortingDescendingSortingSupported() throws Exception {
// Setup
final String searchPhrase = "*";
final String mockTemporalFeatureProperty = "myTemporalFeatureProperty";
final String mockFeatureType = "{http://example.com}" + SAMPLE_FEATURE_NAME + 0;
final int pageSize = 1;
WfsSource source = getWfsSource(ONE_TEXT_PROPERTY_SCHEMA, MockWfsServer.getFilterCapabilities(), 1, false, false, 0);
MetacardMapper mockMetacardMapper = mock(MetacardMapper.class);
when(mockMetacardMapper.getFeatureType()).thenReturn(mockFeatureType);
when(mockMetacardMapper.getSortByTemporalFeatureProperty()).thenReturn(mockTemporalFeatureProperty);
List<MetacardMapper> mappers = new ArrayList<>(1);
mappers.add(mockMetacardMapper);
source.setMetacardToFeatureMapper(mappers);
QueryImpl query = new QueryImpl(builder.attribute(Metacard.ANY_TEXT).is().like().text(searchPhrase));
query.setPageSize(pageSize);
SortBy sortBy = new SortByImpl(Result.TEMPORAL, SortOrder.DESCENDING);
query.setSortBy(sortBy);
// Perform Test
GetFeatureType featureType = source.buildGetFeatureRequest(query);
// Verify
QueryType queryType = (QueryType) featureType.getAbstractQueryExpression().get(0).getValue();
JAXBElement<?> abstractSortingClause = queryType.getAbstractSortingClause();
SortByType sortByType = (SortByType) abstractSortingClause.getValue();
assertThat(sortByType.getSortProperty().get(0).getValueReference(), is(mockTemporalFeatureProperty));
assertThat(sortByType.getSortProperty().get(0).getSortOrder().name(), is(SortOrderType.DESC.value()));
}
use of org.geotoolkit.ogc.xml.v110.SortByType in project geotoolkit by Geomatys.
the class FilterXMLBindingTest method filterMarshalingTest.
/**
* Test simple Record Marshalling.
*
* @throws JAXBException
*/
@Test
public void filterMarshalingTest() throws JAXBException, IOException, ParserConfigurationException, SAXException {
/*
* Test marshalling spatial filter
*/
DirectPositionType lowerCorner = new DirectPositionType(10.0, 11.0);
DirectPositionType upperCorner = new DirectPositionType(10.0, 11.0);
EnvelopeType envelope = new EnvelopeType(lowerCorner, upperCorner, "EPSG:4326");
OverlapsType filterElement = new OverlapsType(new PropertyNameType("boundingBox"), envelope);
FilterType filter = new FilterType(filterElement);
StringWriter sw = new StringWriter();
marshaller.marshal(filter, sw);
String result = sw.toString();
String expResult = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + '\n' + "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:gml=\"http://www.opengis.net/gml\">" + '\n' + " <ogc:Overlaps>" + '\n' + " <ogc:PropertyName>boundingBox</ogc:PropertyName>" + '\n' + " <gml:Envelope srsName=\"EPSG:4326\">" + '\n' + " <gml:lowerCorner>10.0 11.0</gml:lowerCorner>" + '\n' + " <gml:upperCorner>10.0 11.0</gml:upperCorner>" + '\n' + " </gml:Envelope>" + '\n' + " </ogc:Overlaps>" + '\n' + "</ogc:Filter>" + '\n';
LOGGER.log(Level.FINER, "result: {0}", result);
LOGGER.log(Level.FINER, "expected: {0}", expResult);
assertXmlEquals(expResult, result, "xmlns:*");
ObjectFactory factory = new ObjectFactory();
final BBOXType bbox = new BBOXType("propName", envelope);
org.geotoolkit.ogc.xml.v200.FilterType filter2 = new org.geotoolkit.ogc.xml.v200.FilterType(bbox);
sw = new StringWriter();
marshaller.marshal(filter2, sw);
result = sw.toString();
expResult = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<fes:Filter xmlns:fes=\"http://www.opengis.net/fes/2.0\" xmlns:ns8=\"http://www.opengis.net/gml\">\n" + " <fes:BBOX>\n" + " <fes:ValueReference>propName</fes:ValueReference>\n" + " <ns8:Envelope srsName=\"EPSG:4326\">\n" + " <ns8:lowerCorner>10.0 11.0</ns8:lowerCorner>\n" + " <ns8:upperCorner>10.0 11.0</ns8:upperCorner>\n" + " </ns8:Envelope>\n" + " </fes:BBOX>\n" + "</fes:Filter>";
assertXmlEquals(expResult, result, "xmlns:*");
/*--------------------------------------------*/
/*- --------------- DEBUG --------------------*/
/*--------------------------------------------*/
String[] arr = new String[2];
arr[0] = "boby";
arr[1] = "DESC";
SortPropertyType sp = new SortPropertyType(arr[0], SortOrderType.valueOf(arr[1]));
SortByType sort = new SortByType(Arrays.asList(sp));
JAXBElement<SortByType> jbSort = factory.createSortBy(sort);
// marshaller.marshal(jbSort, System.out);
sp = new SortPropertyType(arr[0], FilterUtilities.sortOrder(arr[1]));
sort = new SortByType(Arrays.asList(sp));
jbSort = factory.createSortBy(sort);
// marshaller.marshal(jbSort, System.out);
BBOXType filterBox = new BBOXType("boundingBox", "$test");
org.geotoolkit.ogc.xml.v200.FilterType filter3 = new org.geotoolkit.ogc.xml.v200.FilterType(filterBox);
sw = new StringWriter();
marshaller.marshal(filter3, sw);
result = sw.toString();
expResult = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<fes:Filter xmlns:fes=\"http://www.opengis.net/fes/2.0\">\n" + " <fes:BBOX>\n" + " <fes:ValueReference>boundingBox</fes:ValueReference>$test</fes:BBOX>\n" + "</fes:Filter>";
assertXmlEquals(expResult, result, "xmlns:*");
TimeAfterType filterAfter = new TimeAfterType("boundingBox", "$test");
org.geotoolkit.ogc.xml.v200.FilterType filter4 = new org.geotoolkit.ogc.xml.v200.FilterType(filterAfter);
sw = new StringWriter();
marshaller.marshal(filter4, sw);
result = sw.toString();
expResult = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<fes:Filter xmlns:fes=\"http://www.opengis.net/fes/2.0\">\n" + " <fes:After>\n" + " <fes:ValueReference>boundingBox</fes:ValueReference>$test</fes:After>\n" + "</fes:Filter>";
assertXmlEquals(expResult, result, "xmlns:*");
final org.geotoolkit.gml.xml.v321.ObjectFactory gmlFactory = new org.geotoolkit.gml.xml.v321.ObjectFactory();
final org.geotoolkit.ogc.xml.v200.ObjectFactory fesFactory = new org.geotoolkit.ogc.xml.v200.ObjectFactory();
PropertyIsBetweenType pes = new PropertyIsBetweenType();
pes.setExpression(fesFactory.createValueReference((String) "prop"));
final LowerBoundaryType lower = new LowerBoundaryType();
final TimeInstantType ti = new TimeInstantType("2002");
final LiteralType lowlit = new LiteralType(gmlFactory.createTimeInstant(ti));
lower.setExpression(fesFactory.createLiteral(lowlit));
pes.setLowerBoundary(lower);
final UpperBoundaryType upper = new UpperBoundaryType();
final TimeInstantType ti2 = new TimeInstantType("2004");
final LiteralType upplit = new LiteralType(gmlFactory.createTimeInstant(ti2));
upper.setExpression(fesFactory.createLiteral(upplit));
pes.setUpperBoundary(upper);
org.geotoolkit.ogc.xml.v200.FilterType filter5 = new org.geotoolkit.ogc.xml.v200.FilterType(pes);
sw = new StringWriter();
marshaller.marshal(filter5, sw);
result = sw.toString();
expResult = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<fes:Filter xmlns:gml=\"http://www.opengis.net/gml/3.2\" xmlns:fes=\"http://www.opengis.net/fes/2.0\">\n" + " <fes:PropertyIsBetween>\n" + " <fes:ValueReference>prop</fes:ValueReference>\n" + " <fes:LowerBoundary>\n" + " <fes:Literal>\n" + " <gml:TimeInstant>\n" + " <gml:timePosition>2002</gml:timePosition>\n" + " </gml:TimeInstant>\n" + " </fes:Literal>\n" + " </fes:LowerBoundary>\n" + " <fes:UpperBoundary>\n" + " <fes:Literal>\n" + " <gml:TimeInstant>\n" + " <gml:timePosition>2004</gml:timePosition>\n" + " </gml:TimeInstant>\n" + " </fes:Literal>\n" + " </fes:UpperBoundary>\n" + " </fes:PropertyIsBetween>\n" + "</fes:Filter>";
assertXmlEquals(expResult, result, "xmlns:*");
}
use of org.geotoolkit.ogc.xml.v110.SortByType in project ddf by codice.
the class WfsSourceTest method testSortingAscendingSortingSupported.
/**
* Verify that the SortBy is set with the mapped Feature Property and a ASC sort order. In this
* case, the incoming sort property of TEMPORAL is mapped to myTemporalFeatureProperty.
*
* <p><?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns5:GetFeature startIndex="1"
* count="1" service="WFS" version="2.0.0" xmlns:ns2="http://www.opengis.net/ows/1.1"
* xmlns="http://www.opengis.net/fes/2.0" xmlns:ns4="http://www.opengis.net/gml"
* xmlns:ns3="http://www.w3.org/1999/xlink" xmlns:ns5="http://www.opengis.net/wfs/2.0"> <ns5:Query
* typeNames="SampleFeature0" handle="SampleFeature0"> <Filter> <PropertyIsLike wildCard="*"
* singleChar="?" escapeChar="!"> <Literal>*</Literal> <ValueReference>title</ValueReference>
* </PropertyIsLike> </Filter> <SortBy> <SortProperty>
* <ValueReference>myTemporalFeatureProperty</ValueReference> <SortOrder>ASC</SortOrder>
* </SortProperty> </SortBy> </ns5:Query> </ns5:GetFeature>
*/
@Test
public void testSortingAscendingSortingSupported() throws Exception {
// Setup
final String searchPhrase = "*";
final String mockTemporalFeatureProperty = "myTemporalFeatureProperty";
final String mockFeatureType = "{http://example.com}" + SAMPLE_FEATURE_NAME + 0;
final int pageSize = 1;
WfsSource source = getWfsSource(ONE_TEXT_PROPERTY_SCHEMA, MockWfsServer.getFilterCapabilities(), 1, false, false, 0);
MetacardMapper mockMetacardMapper = mock(MetacardMapper.class);
when(mockMetacardMapper.getFeatureType()).thenReturn(mockFeatureType);
when(mockMetacardMapper.getSortByTemporalFeatureProperty()).thenReturn(mockTemporalFeatureProperty);
List<MetacardMapper> mappers = new ArrayList<MetacardMapper>(1);
mappers.add(mockMetacardMapper);
source.setMetacardToFeatureMapper(mappers);
QueryImpl query = new QueryImpl(builder.attribute(Metacard.ANY_TEXT).is().like().text(searchPhrase));
query.setPageSize(pageSize);
SortBy sortBy = new SortByImpl(Result.TEMPORAL, SortOrder.ASCENDING);
query.setSortBy(sortBy);
// Perform Test
GetFeatureType featureType = source.buildGetFeatureRequest(query);
// Verify
QueryType queryType = (QueryType) featureType.getAbstractQueryExpression().get(0).getValue();
JAXBElement<?> abstractSortingClause = queryType.getAbstractSortingClause();
SortByType sortByType = (SortByType) abstractSortingClause.getValue();
assertThat(sortByType.getSortProperty().get(0).getValueReference(), is(mockTemporalFeatureProperty));
assertThat(sortByType.getSortProperty().get(0).getSortOrder().name(), is(SortOrderType.ASC.value()));
}
use of org.geotoolkit.ogc.xml.v110.SortByType in project ddf by codice.
the class GetRecordsRequest method get202RecordsType.
/**
* Convert the KVP values into a GetRecordsType, validates format of fields and enumeration
* constraints required to meet the schema requirements of the GetRecordsType. No further
* validation is done at this point
*
* @return GetRecordsType representation of this key-value representation
* @throws CswException An exception when some field cannot be converted to the equivalent
* GetRecordsType value
*/
public GetRecordsType get202RecordsType() throws CswException {
GetRecordsType getRecords = new GetRecordsType();
getRecords.setOutputSchema(getOutputSchema());
getRecords.setRequestId(getRequestId());
if (getMaxRecords() != null) {
getRecords.setMaxRecords(getMaxRecords());
}
if (getStartPosition() != null) {
getRecords.setStartPosition(getStartPosition());
}
if (getOutputFormat() != null) {
getRecords.setOutputFormat(getOutputFormat());
}
if (getResponseHandler() != null) {
getRecords.setResponseHandler(Arrays.asList(getResponseHandler()));
}
if (getResultType() != null) {
try {
getRecords.setResultType(ResultType.fromValue(getResultType()));
} catch (IllegalArgumentException iae) {
LOGGER.debug("Failed to find \"{}\" as a valid ResultType", LogSanitizer.sanitize(getResultType()), iae);
throw new CswException("A CSW getRecords request ResultType must be \"hits\", \"results\", or \"validate\"");
}
}
if (getDistributedSearch() != null && getDistributedSearch()) {
DistributedSearchType disSearch = new DistributedSearchType();
disSearch.setHopCount(getHopCount());
getRecords.setDistributedSearch(disSearch);
}
QueryType query = new QueryType();
Map<String, String> namespaces = parseNamespaces(getNamespace());
List<QName> typeNames = typeStringToQNames(getTypeNames(), namespaces);
query.setTypeNames(typeNames);
if (getElementName() != null && getElementSetName() != null) {
LOGGER.debug("CSW getRecords request received with mutually exclusive ElementName and SetElementName set");
throw new CswException("A CSW getRecords request can only have an \"ElementName\" or an \"ElementSetName\"");
}
if (getElementName() != null) {
query.setElementName(typeStringToQNames(getElementName(), namespaces));
}
if (getElementSetName() != null) {
try {
ElementSetNameType eleSetName = new ElementSetNameType();
eleSetName.setTypeNames(typeNames);
eleSetName.setValue(ElementSetType.fromValue(getElementSetName()));
query.setElementSetName(eleSetName);
} catch (IllegalArgumentException iae) {
LOGGER.debug("Failed to find \"{}\" as a valid elementSetType", LogSanitizer.sanitize(getElementSetName()), iae);
throw new CswException("A CSW getRecords request ElementSetType must be \"brief\", \"summary\", or \"full\"");
}
}
if (getSortBy() != null) {
SortByType sort = new SortByType();
List<SortPropertyType> sortProps = new LinkedList<SortPropertyType>();
String[] sortOptions = getSortBy().split(",");
for (String sortOption : sortOptions) {
if (sortOption.lastIndexOf(':') < 1) {
throw new CswException("Invalid Sort Order format: " + getSortBy());
}
SortPropertyType sortProperty = new SortPropertyType();
PropertyNameType propertyName = new PropertyNameType();
String propName = StringUtils.substringBeforeLast(sortOption, ":");
String direction = StringUtils.substringAfterLast(sortOption, ":");
propertyName.setContent(Arrays.asList((Object) propName));
SortOrderType sortOrder;
if (direction.equals("A")) {
sortOrder = SortOrderType.ASC;
} else if (direction.equals("D")) {
sortOrder = SortOrderType.DESC;
} else {
throw new CswException("Invalid Sort Order format: " + getSortBy());
}
sortProperty.setPropertyName(propertyName);
sortProperty.setSortOrder(sortOrder);
sortProps.add(sortProperty);
}
sort.setSortProperty(sortProps);
query.setElementName(typeStringToQNames(getElementName(), namespaces));
query.setSortBy(sort);
}
if (getConstraint() != null) {
QueryConstraintType queryConstraint = new QueryConstraintType();
if (getConstraintLanguage().equalsIgnoreCase(CswConstants.CONSTRAINT_LANGUAGE_CQL)) {
queryConstraint.setCqlText(getConstraint());
} else if (getConstraintLanguage().equalsIgnoreCase(CswConstants.CONSTRAINT_LANGUAGE_FILTER)) {
try {
XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new StringReader(constraint));
Unmarshaller unmarshaller = JAX_BCONTEXT.createUnmarshaller();
@SuppressWarnings("unchecked") JAXBElement<FilterType> jaxbFilter = (JAXBElement<FilterType>) unmarshaller.unmarshal(xmlStreamReader);
queryConstraint.setFilter(jaxbFilter.getValue());
} catch (JAXBException e) {
LOGGER.debug("JAXBException parsing OGC Filter:", e);
throw new CswException("JAXBException parsing OGC Filter:" + getConstraint());
} catch (Exception e) {
LOGGER.debug("Unable to parse OGC Filter:", e);
throw new CswException("Unable to parse OGC Filter:" + getConstraint());
}
} else {
throw new CswException("Invalid Constraint Language defined: " + getConstraintLanguage());
}
query.setConstraint(queryConstraint);
}
JAXBElement<QueryType> jaxbQuery = new JAXBElement<QueryType>(new QName(CswConstants.CSW_OUTPUT_SCHEMA), QueryType.class, query);
getRecords.setAbstractQuery(jaxbQuery);
return getRecords;
}
use of org.geotoolkit.ogc.xml.v110.SortByType in project ddf by codice.
the class WfsSource method buildGetFeatureRequest.
private ExtendedGetFeatureType buildGetFeatureRequest(Query query, ResultTypeType resultType, BigInteger maxFeatures) throws UnsupportedQueryException {
List<ContentType> contentTypes = getContentTypesFromQuery(query);
List<QueryType> queries = new ArrayList<>();
for (Entry<QName, WfsFilterDelegate> filterDelegateEntry : featureTypeFilters.entrySet()) {
if (contentTypes.isEmpty() || isFeatureTypeInQuery(contentTypes, filterDelegateEntry.getKey().getLocalPart())) {
QueryType wfsQuery = new QueryType();
wfsQuery.setTypeName(Collections.singletonList(filterDelegateEntry.getKey()));
if (StringUtils.isNotBlank(srsName)) {
wfsQuery.setSrsName(srsName);
}
FilterType filter = filterAdapter.adapt(query, filterDelegateEntry.getValue());
if (filter != null) {
if (areAnyFiltersSet(filter)) {
wfsQuery.setFilter(filter);
}
if (!this.disableSorting && query.getSortBy() != null && query.getSortBy().getPropertyName() != null && query.getSortBy().getPropertyName().getPropertyName() != null) {
SortByType sortByType = buildSortBy(filterDelegateEntry.getKey(), query.getSortBy());
if (sortByType != null && sortByType.getSortProperty() != null && sortByType.getSortProperty().size() > 0) {
LOGGER.debug("Sorting using sort property [{}] and sort order [{}].", sortByType.getSortProperty().get(0).getPropertyName(), sortByType.getSortProperty().get(0).getSortOrder());
wfsQuery.setSortBy(sortByType);
} else {
throw new UnsupportedQueryException("Source " + this.getId() + " does not support specified sort property " + query.getSortBy().getPropertyName().getPropertyName());
}
} else {
LOGGER.debug("Sorting is disabled or sort not specified.");
}
queries.add(wfsQuery);
} else {
LOGGER.debug("WFS Source {}: {} has an invalid filter.", getId(), filterDelegateEntry.getKey());
}
}
}
if (!queries.isEmpty()) {
ExtendedGetFeatureType getFeatureType = new ExtendedGetFeatureType();
getFeatureType.setMaxFeatures(maxFeatures);
getFeatureType.getQuery().addAll(queries);
getFeatureType.setService(Wfs11Constants.WFS);
getFeatureType.setVersion(Wfs11Constants.VERSION_1_1_0);
getFeatureType.setResultType(resultType);
if (supportsStartIndex && resultType.equals(ResultTypeType.RESULTS)) {
// Convert DDF index of 1 back to index of 0 for WFS
getFeatureType.setStartIndex(BigInteger.valueOf(query.getStartIndex() - 1));
}
logMessage(getFeatureType);
return getFeatureType;
} else {
throw new UnsupportedQueryException("Unable to build query. No filters could be created from query criteria.");
}
}
Aggregations