use of net.opengis.cat.csw.v_2_0_2.QueryConstraintType 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", 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, Exception {}", 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 net.opengis.cat.csw.v_2_0_2.QueryConstraintType in project ddf by codice.
the class TestTransactionRequestConverter method testValidDeleteMarshal.
@Test
public void testValidDeleteMarshal() throws SAXException, IOException, XpathException {
CswTransactionRequest transactionRequest = new CswTransactionRequest();
MetacardImpl metacard = new MetacardImpl();
metacard.setId(METACARD_ID);
DeleteType deleteType = new DeleteType();
QueryConstraintType queryConstraintType = new QueryConstraintType();
queryConstraintType.setCqlText("identifier = " + METACARD_ID);
deleteType.setConstraint(queryConstraintType);
DeleteAction deleteAction = new DeleteAction(deleteType, null);
transactionRequest.getDeleteActions().add(deleteAction);
transactionRequest.setService(CswConstants.CSW);
transactionRequest.setVerbose(true);
transactionRequest.setVersion(CswConstants.VERSION_2_0_2);
String xml = xStream.toXML(transactionRequest);
Diff diff = XMLUnit.compareXML(xml, EXPECTED_DELETE_XML);
assertThat(diff.similar(), is(true));
}
use of net.opengis.cat.csw.v_2_0_2.QueryConstraintType in project ddf by codice.
the class AbstractCswStore method delete.
@Override
public DeleteResponse delete(DeleteRequest deleteRequest) throws IngestException {
Map<String, Serializable> properties = new HashMap<>();
validateOperation();
Subject subject = (Subject) deleteRequest.getPropertyValue(SecurityConstants.SECURITY_SUBJECT);
Csw csw = factory.getClientForSubject(subject);
CswTransactionRequest transactionRequest = getTransactionRequest();
OperationTransaction opTrans = (OperationTransaction) deleteRequest.getPropertyValue(Constants.OPERATION_TRANSACTION_KEY);
String typeName = schemaTransformerManager.getTransformerIdForSchema(cswSourceConfiguration.getOutputSchema());
if (typeName == null) {
typeName = CswConstants.CSW_RECORD;
}
for (Serializable itemToDelete : deleteRequest.getAttributeValues()) {
try {
DeleteType deleteType = new DeleteType();
deleteType.setTypeName(typeName);
QueryConstraintType queryConstraintType = new QueryConstraintType();
Filter filter;
FilterType filterType;
filter = filterBuilder.attribute(deleteRequest.getAttributeName()).is().equalTo().text(itemToDelete.toString());
filterType = filterAdapter.adapt(filter, cswFilterDelegate);
queryConstraintType.setCqlText(CswCqlTextFilter.getInstance().getCqlText(filterType));
deleteType.setConstraint(queryConstraintType);
DeleteAction deleteAction = new DeleteAction(deleteType, DefaultCswRecordMap.getPrefixToUriMapping());
transactionRequest.getDeleteActions().add(deleteAction);
} catch (UnsupportedQueryException e) {
throw new IngestException("Unsupported Query.", e);
}
}
try {
TransactionResponseType response = csw.transaction(transactionRequest);
if (response.getTransactionSummary().getTotalDeleted().intValue() != deleteRequest.getAttributeValues().size()) {
throw new IngestException("Csw Transaction Failed. Number of metacards deleted did not match number requested.");
}
} catch (CswException e) {
throw new IngestException("Csw Transaction Failed", e);
}
return new DeleteResponseImpl(deleteRequest, properties, new ArrayList(opTrans.getPreviousStateMetacards()));
}
use of net.opengis.cat.csw.v_2_0_2.QueryConstraintType in project ddf by codice.
the class AbstractCswSource method createQuery.
private JAXBElement<QueryType> createQuery(Query query, ElementSetType elementSetType, List<QName> elementNames) throws UnsupportedQueryException {
QueryType queryType = new QueryType();
QName queryTypeQName = null;
try {
if (StringUtils.isNotBlank(cswSourceConfiguration.getQueryTypeName())) {
String[] parts = cswSourceConfiguration.getQueryTypeName().split(":");
if (parts.length > 1) {
queryTypeQName = new QName(cswSourceConfiguration.getQueryTypeNamespace(), parts[1], parts[0]);
} else {
queryTypeQName = new QName(cswSourceConfiguration.getQueryTypeNamespace(), cswSourceConfiguration.getQueryTypeName());
}
}
} catch (IllegalArgumentException e) {
LOGGER.debug("Unable to parse query type QName of {}. Defaulting to CSW Record", cswSourceConfiguration.getQueryTypeName());
}
if (queryTypeQName == null) {
queryTypeQName = new QName(CswConstants.CSW_OUTPUT_SCHEMA, CswConstants.CSW_RECORD_LOCAL_NAME, CswConstants.CSW_NAMESPACE_PREFIX);
}
queryType.setTypeNames(Arrays.asList(queryTypeQName));
if (null != elementSetType) {
queryType.setElementSetName(createElementSetName(elementSetType));
} else if (!CollectionUtils.isEmpty(elementNames)) {
queryType.setElementName(elementNames);
} else {
queryType.setElementSetName(createElementSetName(ElementSetType.FULL));
}
SortByType sortBy = createSortBy(query);
if (sortBy != null) {
queryType.setSortBy(sortBy);
}
QueryConstraintType constraint = createQueryConstraint(query);
if (null != constraint) {
queryType.setConstraint(constraint);
}
ObjectFactory objectFactory = new ObjectFactory();
return objectFactory.createQuery(queryType);
}
use of net.opengis.cat.csw.v_2_0_2.QueryConstraintType in project ddf by codice.
the class TestCswEndpoint method testUpdateTransactionWithConstraint.
@Test
public void testUpdateTransactionWithConstraint() throws CswException, FederationException, IngestException, SourceUnavailableException, UnsupportedQueryException {
List<Result> results = new ArrayList<>();
MetacardImpl firstResult = new MetacardImpl();
firstResult.setId("123");
firstResult.setTitle("Title one");
firstResult.setAttribute("subject", "Subject one");
results.add(new ResultImpl(firstResult));
MetacardImpl secondResult = new MetacardImpl();
secondResult.setId("789");
secondResult.setTitle("Title two");
secondResult.setAttribute("subject", "Subject two");
results.add(new ResultImpl(secondResult));
QueryResponse queryResponse = new QueryResponseImpl(null, results, results.size());
doReturn(queryResponse).when(catalogFramework).query(any(QueryRequest.class));
List<Update> updatedMetacards = new ArrayList<>();
updatedMetacards.add(new UpdateImpl(new MetacardImpl(), new MetacardImpl()));
updatedMetacards.add(new UpdateImpl(new MetacardImpl(), new MetacardImpl()));
UpdateResponse updateResponse = new UpdateResponseImpl(null, null, updatedMetacards);
doReturn(updateResponse).when(catalogFramework).update(any(UpdateRequest.class));
Map<String, Serializable> recordProperties = new HashMap<>();
recordProperties.put("title", "foo");
recordProperties.put("subject", "bar");
QueryConstraintType constraint = new QueryConstraintType();
constraint.setCqlText("title = 'fake'");
UpdateAction updateAction = new UpdateAction(recordProperties, CswConstants.CSW_RECORD, "", constraint, DefaultCswRecordMap.getDefaultCswRecordMap().getPrefixToUriMapping());
CswTransactionRequest updateRequest = new CswTransactionRequest();
updateRequest.getUpdateActions().add(updateAction);
updateRequest.setVersion(CswConstants.VERSION_2_0_2);
updateRequest.setService(CswConstants.CSW);
updateRequest.setVerbose(false);
TransactionResponseType response = csw.transaction(updateRequest);
assertThat(response, notNullValue());
TransactionSummaryType summary = response.getTransactionSummary();
assertThat(summary, notNullValue());
assertThat(summary.getTotalDeleted().intValue(), is(0));
assertThat(summary.getTotalInserted().intValue(), is(0));
assertThat(summary.getTotalUpdated().intValue(), is(2));
verifyMarshalResponse(response, "net.opengis.cat.csw.v_2_0_2:net.opengis.filter.v_1_1_0:net.opengis.gml.v_3_1_1", cswQnameOutPutSchema);
ArgumentCaptor<UpdateRequest> updateRequestArgumentCaptor = ArgumentCaptor.forClass(UpdateRequest.class);
verify(catalogFramework, times(1)).update(updateRequestArgumentCaptor.capture());
UpdateRequest actualUpdateRequest = updateRequestArgumentCaptor.getValue();
List<Map.Entry<Serializable, Metacard>> updates = actualUpdateRequest.getUpdates();
assertThat(updates.size(), is(2));
Metacard firstUpdate = updates.get(0).getValue();
assertThat(firstUpdate.getId(), is("123"));
assertThat(firstUpdate.getTitle(), is("foo"));
assertThat(firstUpdate.getAttribute("subject").getValue(), is("bar"));
Metacard secondUpdate = updates.get(1).getValue();
assertThat(secondUpdate.getId(), is("789"));
assertThat(secondUpdate.getTitle(), is("foo"));
assertThat(secondUpdate.getAttribute("subject").getValue(), is("bar"));
}
Aggregations