/**
* Copyright (C) 2012-2017 52°North Initiative for Geospatial Open Source
* Software GmbH
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*
* If the program is linked with libraries which are licensed under one of
* the following licenses, the combination of the program with the linked
* library is not considered a "derivative work" of the program:
*
* - Apache License, version 2.0
* - Apache Software License, version 1.0
* - GNU Lesser General Public License, version 3
* - Mozilla Public License, versions 1.0, 1.1 and 2.0
* - Common Development and Distribution License (CDDL), version 1.0
*
* Therefore the distribution of the program linked with libraries licensed
* under the aforementioned licenses, is permitted by the copyright holders
* if the distribution is compliant with both the GNU General Public
* License version 2 and the aforementioned licenses.
*
* 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.
*/
package org.n52.sos.decode;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlString;
import org.n52.sos.exception.ows.InvalidParameterValueException;
import org.n52.sos.exception.ows.NoApplicableCodeException;
import org.n52.sos.exception.ows.concrete.MissingResultValuesException;
import org.n52.sos.exception.ows.concrete.UnsupportedDecoderInputException;
import org.n52.sos.ogc.filter.SpatialFilter;
import org.n52.sos.ogc.filter.TemporalFilter;
import org.n52.sos.ogc.gml.AbstractFeature;
import org.n52.sos.ogc.gml.time.Time;
import org.n52.sos.ogc.gml.time.TimeInstant;
import org.n52.sos.ogc.gml.time.TimePeriod;
import org.n52.sos.ogc.om.OmObservation;
import org.n52.sos.ogc.om.OmObservationConstellation;
import org.n52.sos.ogc.ows.CompositeOwsException;
import org.n52.sos.ogc.ows.OwsExceptionReport;
import org.n52.sos.ogc.sos.Sos2Constants;
import org.n52.sos.ogc.sos.SosConstants;
import org.n52.sos.ogc.sos.SosResultEncoding;
import org.n52.sos.ogc.sos.SosResultStructure;
import org.n52.sos.ogc.swe.SweAbstractDataComponent;
import org.n52.sos.ogc.swe.encoding.SweAbstractEncoding;
import org.n52.sos.request.AbstractServiceRequest;
import org.n52.sos.request.GetCapabilitiesRequest;
import org.n52.sos.request.GetFeatureOfInterestRequest;
import org.n52.sos.request.GetObservationByIdRequest;
import org.n52.sos.request.GetObservationRequest;
import org.n52.sos.request.GetResultRequest;
import org.n52.sos.request.GetResultTemplateRequest;
import org.n52.sos.request.InsertObservationRequest;
import org.n52.sos.request.InsertResultRequest;
import org.n52.sos.request.InsertResultTemplateRequest;
import org.n52.sos.response.AbstractServiceResponse;
import org.n52.sos.response.GetResultResponse;
import org.n52.sos.response.GetResultTemplateResponse;
import org.n52.sos.service.AbstractServiceCommunicationObject;
import org.n52.sos.service.ServiceConstants.SupportedTypeKey;
import org.n52.sos.util.CodingHelper;
import org.n52.sos.util.CollectionHelper;
import org.n52.sos.util.XmlHelper;
import org.n52.sos.w3c.W3CConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.google.common.base.Joiner;
import net.opengis.sos.x20.GetCapabilitiesDocument;
import net.opengis.sos.x20.GetCapabilitiesType;
import net.opengis.sos.x20.GetFeatureOfInterestDocument;
import net.opengis.sos.x20.GetFeatureOfInterestType;
import net.opengis.sos.x20.GetObservationByIdDocument;
import net.opengis.sos.x20.GetObservationByIdType;
import net.opengis.sos.x20.GetObservationDocument;
import net.opengis.sos.x20.GetObservationType;
import net.opengis.sos.x20.GetResultDocument;
import net.opengis.sos.x20.GetResultResponseDocument;
import net.opengis.sos.x20.GetResultResponseType;
import net.opengis.sos.x20.GetResultTemplateDocument;
import net.opengis.sos.x20.GetResultTemplateResponseDocument;
import net.opengis.sos.x20.GetResultTemplateResponseType;
import net.opengis.sos.x20.GetResultTemplateType;
import net.opengis.sos.x20.GetResultType;
import net.opengis.sos.x20.InsertObservationDocument;
import net.opengis.sos.x20.InsertObservationType;
import net.opengis.sos.x20.InsertObservationType.Observation;
import net.opengis.sos.x20.InsertResultDocument;
import net.opengis.sos.x20.InsertResultTemplateDocument;
import net.opengis.sos.x20.InsertResultTemplateType;
import net.opengis.sos.x20.InsertResultType;
import net.opengis.sos.x20.ResultTemplateType;
import net.opengis.sos.x20.ResultTemplateType.ObservationTemplate;
/**
* @since 4.0.0
*
*/
public class SosDecoderv20 extends AbstractSwesDecoderv20
implements Decoder<AbstractServiceCommunicationObject, XmlObject> {
private static final Logger LOGGER = LoggerFactory.getLogger(SosDecoderv20.class);
@SuppressWarnings("unchecked")
private static final Set<DecoderKey> DECODER_KEYS = CollectionHelper.union(
CodingHelper.decoderKeysForElements(Sos2Constants.NS_SOS_20, GetCapabilitiesDocument.class,
GetObservationDocument.class, GetFeatureOfInterestDocument.class, GetObservationByIdDocument.class,
InsertObservationDocument.class, InsertResultTemplateDocument.class, InsertResultDocument.class,
GetResultTemplateDocument.class, GetResultDocument.class, GetResultTemplateResponseDocument.class,
GetResultResponseDocument.class),
CodingHelper.xmlDecoderKeysForOperation(SosConstants.SOS, Sos2Constants.SERVICEVERSION,
SosConstants.Operations.GetCapabilities, SosConstants.Operations.GetObservation,
SosConstants.Operations.GetFeatureOfInterest, SosConstants.Operations.GetObservationById,
SosConstants.Operations.InsertObservation, Sos2Constants.Operations.InsertResultTemplate,
Sos2Constants.Operations.InsertResult, Sos2Constants.Operations.GetResultTemplate,
SosConstants.Operations.GetResult));
public SosDecoderv20() {
LOGGER.debug("Decoder for the following keys initialized successfully: {}!",
Joiner.on(", ").join(DECODER_KEYS));
}
@Override
public Set<DecoderKey> getDecoderKeyTypes() {
return Collections.unmodifiableSet(DECODER_KEYS);
}
@Override
public Map<SupportedTypeKey, Set<String>> getSupportedTypes() {
return Collections.emptyMap();
}
@Override
public Set<String> getConformanceClasses() {
return Collections.emptySet();
}
@Override
public AbstractServiceCommunicationObject decode(final XmlObject xml) throws OwsExceptionReport {
LOGGER.debug("REQUESTTYPE:" + xml.getClass());
// validate document
XmlHelper.validateDocument(xml);
if (xml instanceof GetCapabilitiesDocument) {
return parseGetCapabilities((GetCapabilitiesDocument) xml);
} else if (xml instanceof GetObservationDocument) {
return parseGetObservation((GetObservationDocument) xml);
} else if (xml instanceof GetFeatureOfInterestDocument) {
return parseGetFeatureOfInterest((GetFeatureOfInterestDocument) xml);
} else if (xml instanceof GetObservationByIdDocument) {
return parseGetObservationById((GetObservationByIdDocument) xml);
} else if (xml instanceof InsertObservationDocument) {
return parseInsertObservation((InsertObservationDocument) xml);
} else if (xml instanceof InsertResultTemplateDocument) {
return parseInsertResultTemplate((InsertResultTemplateDocument) xml);
} else if (xml instanceof InsertResultDocument) {
return parseInsertResult((InsertResultDocument) xml);
} else if (xml instanceof GetResultTemplateDocument) {
return parseGetResultTemplate((GetResultTemplateDocument) xml);
} else if (xml instanceof GetResultDocument) {
return parseGetResult((GetResultDocument) xml);
} else if (xml instanceof GetResultTemplateResponseDocument) {
return parseGetResultTemplateResponse((GetResultTemplateResponseDocument) xml);
} else if (xml instanceof GetResultResponseDocument) {
return parseGetResultResponse((GetResultResponseDocument) xml);
} else {
throw new UnsupportedDecoderInputException(this, xml);
}
}
/**
* parses the XmlBean representing the getCapabilities request and creates a
* SosGetCapabilities request
*
* @param getCapsDoc
* XmlBean created from the incoming request stream
* @return Returns SosGetCapabilitiesRequest representing the request
*
*
* @throws OwsExceptionReport
* * If parsing the XmlBean failed
*/
private AbstractServiceRequest<?> parseGetCapabilities(final GetCapabilitiesDocument getCapsDoc)
throws OwsExceptionReport {
final GetCapabilitiesRequest request = new GetCapabilitiesRequest();
final GetCapabilitiesType getCapsType = getCapsDoc.getGetCapabilities2();
request.setService(getCapsType.getService());
if (getCapsType.getAcceptFormats() != null && getCapsType.getAcceptFormats().sizeOfOutputFormatArray() != 0) {
request.setAcceptFormats(Arrays.asList(getCapsType.getAcceptFormats().getOutputFormatArray()));
}
if (getCapsType.getAcceptVersions() != null && getCapsType.getAcceptVersions().sizeOfVersionArray() != 0) {
request.setAcceptVersions(Arrays.asList(getCapsType.getAcceptVersions().getVersionArray()));
}
if (getCapsType.getSections() != null && getCapsType.getSections().getSectionArray().length != 0) {
request.setSections(Arrays.asList(getCapsType.getSections().getSectionArray()));
}
if (getCapsType.getExtensionArray() != null && getCapsType.getExtensionArray().length > 0) {
request.setExtensions(parseExtensibleRequestExtension(getCapsType.getExtensionArray()));
}
return request;
}
/**
* parses the XmlBean representing the getObservation request and creates a
* SoSGetObservation request
*
* @param getObsDoc
* XmlBean created from the incoming request stream
* @return Returns SosGetObservationRequest representing the request
*
*
* @throws OwsExceptionReport
* * If parsing the XmlBean failed
*/
private AbstractServiceRequest<?> parseGetObservation(final GetObservationDocument getObsDoc)
throws OwsExceptionReport {
final GetObservationRequest getObsRequest = new GetObservationRequest();
final GetObservationType getObsType = getObsDoc.getGetObservation();
// TODO: check
getObsRequest.setService(getObsType.getService());
getObsRequest.setVersion(getObsType.getVersion());
getObsRequest.setOfferings(Arrays.asList(getObsType.getOfferingArray()));
getObsRequest.setObservedProperties(Arrays.asList(getObsType.getObservedPropertyArray()));
getObsRequest.setProcedures(Arrays.asList(getObsType.getProcedureArray()));
getObsRequest.setTemporalFilters(parseTemporalFilters4GetObservation(getObsType.getTemporalFilterArray()));
if (getObsType.isSetSpatialFilter()) {
getObsRequest.setSpatialFilter(parseSpatialFilter4GetObservation(getObsType.getSpatialFilter()));
}
getObsRequest.setFeatureIdentifiers(Arrays.asList(getObsType.getFeatureOfInterestArray()));
if (getObsType.isSetResponseFormat()) {
try {
final String responseFormat = URLDecoder.decode(getObsType.getResponseFormat(), "UTF-8");
getObsRequest.setResponseFormat(responseFormat);
} catch (final UnsupportedEncodingException e) {
throw new NoApplicableCodeException().causedBy(e).withMessage("Error while encoding response format!");
}
}
getObsRequest.setExtensions(parseExtensibleRequest(getObsType));
return getObsRequest;
}
// private SwesExtensions parseSwesExtensions(final XmlObject[]
// extensionArray) throws OwsExceptionReport
// {
// final SwesExtensions extensions = new SwesExtensions();
// for (final XmlObject xbSwesExtension : extensionArray) {
//
// final Object obj = CodingHelper.decodeXmlElement(xbSwesExtension);
// if (obj instanceof SwesExtension<?>) {
// extensions.addSwesExtension((SwesExtension<?>) obj);
// }
// }
// return extensions;
// }
/**
* parses the passes XmlBeans document and creates a SOS
* getFeatureOfInterest request
*
* @param getFoiDoc
* XmlBeans document representing the getFeatureOfInterest
* request
* @return Returns SOS getFeatureOfInterest request
*
*
* @throws OwsExceptionReport
* * if validation of the request failed
*/
private AbstractServiceRequest<?> parseGetFeatureOfInterest(final GetFeatureOfInterestDocument getFoiDoc)
throws OwsExceptionReport {
final GetFeatureOfInterestRequest getFoiRequest = new GetFeatureOfInterestRequest();
final GetFeatureOfInterestType getFoiType = getFoiDoc.getGetFeatureOfInterest();
getFoiRequest.setService(getFoiType.getService());
getFoiRequest.setVersion(getFoiType.getVersion());
getFoiRequest.setFeatureIdentifiers(Arrays.asList(getFoiType.getFeatureOfInterestArray()));
getFoiRequest.setObservedProperties(Arrays.asList(getFoiType.getObservedPropertyArray()));
getFoiRequest.setProcedures(Arrays.asList(getFoiType.getProcedureArray()));
getFoiRequest.setSpatialFilters(parseSpatialFilters4GetFeatureOfInterest(getFoiType.getSpatialFilterArray()));
getFoiRequest.setExtensions(parseExtensibleRequest(getFoiType));
return getFoiRequest;
}
private AbstractServiceRequest<?> parseGetObservationById(final GetObservationByIdDocument getObsByIdDoc)
throws OwsExceptionReport {
final GetObservationByIdRequest getObsByIdRequest = new GetObservationByIdRequest();
final GetObservationByIdType getObsByIdType = getObsByIdDoc.getGetObservationById();
getObsByIdRequest.setService(getObsByIdType.getService());
getObsByIdRequest.setVersion(getObsByIdType.getVersion());
getObsByIdRequest.setObservationIdentifier(Arrays.asList(getObsByIdType.getObservationArray()));
getObsByIdRequest.setExtensions(parseExtensibleRequest(getObsByIdType));
return getObsByIdRequest;
}
private AbstractServiceRequest<?> parseInsertObservation(final InsertObservationDocument insertObservationDoc)
throws OwsExceptionReport {
// set namespace for default XML type (e.g. xs:string, xs:integer,
// xs:boolean, ...)
// Fix for problem with XmlBeans: namespace is not set in child elements
// when defined in root of request (SOAP)
final XmlCursor cursor = insertObservationDoc.newCursor();
if (cursor.toFirstChild() && cursor.namespaceForPrefix(W3CConstants.NS_XS_PREFIX) == null) {
cursor.prefixForNamespace(W3CConstants.NS_XS);
}
cursor.dispose();
final InsertObservationRequest insertObservationRequest = new InsertObservationRequest();
final InsertObservationType insertObservationType = insertObservationDoc.getInsertObservation();
insertObservationRequest.setService(insertObservationType.getService());
insertObservationRequest.setVersion(insertObservationType.getVersion());
if (insertObservationDoc.getInsertObservation().getOfferingArray() != null) {
insertObservationRequest.setOfferings(Arrays.asList(insertObservationType.getOfferingArray()));
}
insertObservationRequest.setExtensions(parseExtensibleRequest(insertObservationType));
if (insertObservationType.getObservationArray() != null) {
// final int length = insertObservationType.getObservationArray().length;
// final Map<String, Time> phenomenonTimes = new HashMap<String,
// Time>(length);
// final Map<String, TimeInstant> resultTimes = new HashMap<String,
// TimeInstant>(length);
// final Map<String, AbstractFeature> features = new HashMap<String,
// AbstractFeature>(length);
final CompositeOwsException exceptions = new CompositeOwsException();
for (final Observation observation : insertObservationType.getObservationArray()) {
final Object decodedObject = CodingHelper.decodeXmlElement(observation.getOMObservation());
if (decodedObject instanceof OmObservation) {
// final OmObservation sosObservation = (OmObservation)
// decodedObject;
// checkAndAddPhenomenonTime(sosObservation.getPhenomenonTime(),
// phenomenonTimes);
// checkAndAddResultTime(sosObservation.getResultTime(),
// resultTimes);
// checkAndAddFeatures(sosObservation.getObservationConstellation().getFeatureOfInterest(),
// features);
insertObservationRequest.addObservation((OmObservation) decodedObject);
} else {
throw new InvalidParameterValueException().at(Sos2Constants.InsertObservationParams.observation)
.withMessage("The requested observation type (%s) is not supported by this server!",
observation.getOMObservation().getDomNode().getNodeName());
}
}
// checkReferencedElements(insertObservationRequest.getObservations(),
// phenomenonTimes, resultTimes, features);
exceptions.throwIfNotEmpty();
} else {
// TODO MissingMandatoryParameterException?
throw new InvalidParameterValueException().at(Sos2Constants.InsertObservationParams.observation)
.withMessage("The request does not contain an observation");
}
return insertObservationRequest;
}
private AbstractServiceRequest<?> parseInsertResultTemplate(
final InsertResultTemplateDocument insertResultTemplateDoc) throws OwsExceptionReport {
final InsertResultTemplateRequest sosInsertResultTemplate = new InsertResultTemplateRequest();
final InsertResultTemplateType insertResultTemplate = insertResultTemplateDoc.getInsertResultTemplate();
sosInsertResultTemplate.setService(insertResultTemplate.getService());
sosInsertResultTemplate.setVersion(insertResultTemplate.getVersion());
final ResultTemplateType resultTemplate = insertResultTemplate.getProposedTemplate().getResultTemplate();
sosInsertResultTemplate.setIdentifier(resultTemplate.getIdentifier());
final OmObservationConstellation sosObservationConstellation =
parseObservationTemplate(resultTemplate.getObservationTemplate());
sosObservationConstellation.addOffering(resultTemplate.getOffering());
sosInsertResultTemplate.setObservationTemplate(sosObservationConstellation);
sosInsertResultTemplate.setResultStructure(
parseResultStructure(resultTemplate.getResultStructure().getAbstractDataComponent()));
sosInsertResultTemplate
.setResultEncoding(parseResultEncoding(resultTemplate.getResultEncoding().getAbstractEncoding()));
sosInsertResultTemplate.setExtensions(parseExtensibleRequest(insertResultTemplate));
return sosInsertResultTemplate;
}
private AbstractServiceRequest<?> parseInsertResult(final InsertResultDocument insertResultDoc)
throws OwsExceptionReport {
final InsertResultType insertResult = insertResultDoc.getInsertResult();
final InsertResultRequest sosInsertResultRequest = new InsertResultRequest();
sosInsertResultRequest.setService(insertResult.getService());
sosInsertResultRequest.setVersion(insertResult.getVersion());
sosInsertResultRequest.setTemplateIdentifier(insertResult.getTemplate());
sosInsertResultRequest.setResultValues(parseResultValues(insertResult.getResultValues()));
sosInsertResultRequest.setExtensions(parseExtensibleRequest(insertResult));
return sosInsertResultRequest;
}
private AbstractServiceRequest<?> parseGetResult(final GetResultDocument getResultDoc) throws OwsExceptionReport {
final GetResultType getResult = getResultDoc.getGetResult();
final GetResultRequest sosGetResultRequest = new GetResultRequest();
sosGetResultRequest.setService(getResult.getService());
sosGetResultRequest.setVersion(getResult.getVersion());
sosGetResultRequest.setOffering(getResult.getOffering());
sosGetResultRequest.setObservedProperty(getResult.getObservedProperty());
sosGetResultRequest.setFeatureIdentifiers(Arrays.asList(getResult.getFeatureOfInterestArray()));
getResult.getFeatureOfInterestArray();
if (getResult.isSetSpatialFilter()) {
sosGetResultRequest.setSpatialFilter(parseSpatialFilter4GetResult(getResult.getSpatialFilter()));
}
sosGetResultRequest.setExtensions(parseExtensibleRequest(getResult));
sosGetResultRequest.setTemporalFilter(parseTemporalFilters4GetResult(getResult.getTemporalFilterArray()));
return sosGetResultRequest;
}
private AbstractServiceRequest<?> parseGetResultTemplate(final GetResultTemplateDocument getResultTemplateDoc)
throws OwsExceptionReport {
final GetResultTemplateType getResultTemplate = getResultTemplateDoc.getGetResultTemplate();
final GetResultTemplateRequest sosGetResultTemplateRequest = new GetResultTemplateRequest();
sosGetResultTemplateRequest.setService(getResultTemplate.getService());
sosGetResultTemplateRequest.setVersion(getResultTemplate.getVersion());
sosGetResultTemplateRequest.setOffering(getResultTemplate.getOffering());
sosGetResultTemplateRequest.setObservedProperty(getResultTemplate.getObservedProperty());
sosGetResultTemplateRequest.setExtensions(parseExtensibleRequest(getResultTemplate));
return sosGetResultTemplateRequest;
}
private AbstractServiceResponse parseGetResultTemplateResponse(
final GetResultTemplateResponseDocument getResultTemplateResponseDoc) throws OwsExceptionReport {
final GetResultTemplateResponse sosGetResultTemplateResponse = new GetResultTemplateResponse();
final GetResultTemplateResponseType getResultTemplateResponse =
getResultTemplateResponseDoc.getGetResultTemplateResponse();
final SosResultEncoding resultEncoding =
parseResultEncoding(getResultTemplateResponse.getResultEncoding().getAbstractEncoding());
final SosResultStructure resultStructure =
parseResultStructure(getResultTemplateResponse.getResultStructure().getAbstractDataComponent());
sosGetResultTemplateResponse.setResultEncoding(resultEncoding);
sosGetResultTemplateResponse.setResultStructure(resultStructure);
return sosGetResultTemplateResponse;
}
private AbstractServiceResponse parseGetResultResponse(final GetResultResponseDocument getResultResponseDoc)
throws OwsExceptionReport {
final GetResultResponse sosGetResultResponse = new GetResultResponse();
final GetResultResponseType getResultResponse = getResultResponseDoc.getGetResultResponse();
final String resultValues = parseResultValues(getResultResponse.getResultValues());
// sosGetResultResponse.setResultValues(resultValues);
return sosGetResultResponse;
}
/**
* Parses the spatial filter of a GetObservation request.
*
* @param spatialFilter
* XmlBean representing the spatial filter parameter of the
* request
* @return Returns SpatialFilter created from the passed foi request
* parameter
*
*
* @throws OwsExceptionReport
* * if creation of the SpatialFilter failed
*/
private SpatialFilter parseSpatialFilter4GetObservation(
final net.opengis.sos.x20.GetObservationType.SpatialFilter spatialFilter) throws OwsExceptionReport {
if (spatialFilter != null && spatialFilter.getSpatialOps() != null) {
final Object filter = CodingHelper.decodeXmlElement(spatialFilter.getSpatialOps());
if (filter instanceof SpatialFilter) {
return (SpatialFilter) filter;
}
}
return null;
}
/**
* Parses the spatial filters of a GetFeatureOfInterest request.
*
* @param spatialFilters
* XmlBean representing the spatial filter parameter of the
* request
* @return Returns SpatialFilter created from the passed foi request
* parameter
*
*
* @throws OwsExceptionReport
* * if creation of the SpatialFilter failed
*/
private List<SpatialFilter> parseSpatialFilters4GetFeatureOfInterest(
final net.opengis.sos.x20.GetFeatureOfInterestType.SpatialFilter[] spatialFilters)
throws OwsExceptionReport {
final List<SpatialFilter> sosSpatialFilters = new ArrayList<SpatialFilter>(spatialFilters.length);
for (final net.opengis.sos.x20.GetFeatureOfInterestType.SpatialFilter spatialFilter : spatialFilters) {
final Object filter = CodingHelper.decodeXmlElement(spatialFilter.getSpatialOps());
if (filter instanceof SpatialFilter) {
sosSpatialFilters.add((SpatialFilter) filter);
}
}
return sosSpatialFilters;
}
private SpatialFilter parseSpatialFilter4GetResult(
final net.opengis.sos.x20.GetResultType.SpatialFilter spatialFilter) throws OwsExceptionReport {
if (spatialFilter != null && spatialFilter.getSpatialOps() != null) {
final Object filter = CodingHelper.decodeXmlElement(spatialFilter.getSpatialOps());
if (filter instanceof SpatialFilter) {
return (SpatialFilter) filter;
}
}
return null;
}
/**
* parses the Time of the requests and returns an array representing the
* temporal filters
*
* @param temporalFilters
* array of XmlObjects representing the Time element in the
* request
* @return Returns array representing the temporal filters
*
*
* @throws OwsExceptionReport
* * if parsing of the element failed
*/
private List<TemporalFilter> parseTemporalFilters4GetObservation(
final net.opengis.sos.x20.GetObservationType.TemporalFilter[] temporalFilters) throws OwsExceptionReport {
final List<TemporalFilter> sosTemporalFilters = new ArrayList<TemporalFilter>(temporalFilters.length);
for (final net.opengis.sos.x20.GetObservationType.TemporalFilter temporalFilter : temporalFilters) {
final Object filter = CodingHelper.decodeXmlElement(temporalFilter.getTemporalOps());
if (filter instanceof TemporalFilter) {
sosTemporalFilters.add((TemporalFilter) filter);
}
}
return sosTemporalFilters;
}
private List<TemporalFilter> parseTemporalFilters4GetResult(
final net.opengis.sos.x20.GetResultType.TemporalFilter[] temporalFilters) throws OwsExceptionReport {
final List<TemporalFilter> sosTemporalFilters = new ArrayList<TemporalFilter>(temporalFilters.length);
for (final net.opengis.sos.x20.GetResultType.TemporalFilter temporalFilter : temporalFilters) {
final Object filter = CodingHelper.decodeXmlElement(temporalFilter.getTemporalOps());
if (filter instanceof TemporalFilter) {
sosTemporalFilters.add((TemporalFilter) filter);
}
}
return sosTemporalFilters;
}
private OmObservationConstellation parseObservationTemplate(final ObservationTemplate observationTemplate)
throws OwsExceptionReport {
final Object decodedObject = CodingHelper.decodeXmlElement(observationTemplate.getOMObservation());
if (decodedObject instanceof OmObservation) {
final OmObservation observation = (OmObservation) decodedObject;
return observation.getObservationConstellation();
}
return null;
}
private SosResultStructure parseResultStructure(final XmlObject resultStructure) throws OwsExceptionReport {
final Object decodedObject = CodingHelper.decodeXmlElement(resultStructure);
if (decodedObject instanceof SweAbstractDataComponent) {
final SweAbstractDataComponent sosSweData = (SweAbstractDataComponent) decodedObject;
final SosResultStructure sosResultStructure = new SosResultStructure();
sosResultStructure.setResultStructure(sosSweData);
return sosResultStructure;
} else {
throw new InvalidParameterValueException().at(Sos2Constants.InsertObservationParams.observation)
.withMessage("The requested result structure (%s) is not supported by this server!",
resultStructure.getDomNode().getNodeName());
}
}
private SosResultEncoding parseResultEncoding(final XmlObject resultEncoding) throws OwsExceptionReport {
final Object decodedObject = CodingHelper.decodeXmlElement(resultEncoding);
if (decodedObject instanceof SweAbstractEncoding) {
final SweAbstractEncoding sosSweEncoding = (SweAbstractEncoding) decodedObject;
final SosResultEncoding encoding = new SosResultEncoding();
encoding.setEncoding(sosSweEncoding);
return encoding;
} else {
throw new InvalidParameterValueException().at(Sos2Constants.InsertObservationParams.observation)
.withMessage("The requested result encoding (%s) is not supported by this server!",
resultEncoding.getDomNode().getNodeName());
}
}
private String parseResultValues(final XmlObject resultValues) throws OwsExceptionReport {
if (resultValues.schemaType() == XmlString.type) {
return ((XmlString) resultValues).getStringValue().trim();
} else if (resultValues.schemaType() == XmlObject.type) {
final Node resultValuesNode = resultValues.getDomNode();
if (resultValuesNode.hasChildNodes()) {
final NodeList childNodes = resultValuesNode.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
final Node childNode = childNodes.item(i);
if (childNode.getNodeType() == Node.TEXT_NODE) {
return childNode.getNodeValue().trim();
}
}
}
throw new MissingResultValuesException();
} else {
throw new NoApplicableCodeException().withMessage("The requested resultValue type is not supported");
}
}
@Deprecated
private void checkAndAddPhenomenonTime(final Time phenomenonTime, final Map<String, Time> phenomenonTimes) {
if (!phenomenonTime.isReferenced()) {
phenomenonTimes.put(phenomenonTime.getGmlId(), phenomenonTime);
}
}
@Deprecated
private void checkAndAddResultTime(final TimeInstant resultTime, final Map<String, TimeInstant> resultTimes) {
if (!resultTime.isReferenced()) {
resultTimes.put(resultTime.getGmlId(), resultTime);
}
}
@Deprecated
private void checkAndAddFeatures(final AbstractFeature featureOfInterest,
final Map<String, AbstractFeature> features) {
if (!featureOfInterest.isReferenced()) {
features.put(featureOfInterest.getGmlId(), featureOfInterest);
}
}
@Deprecated
private void checkReferencedElements(final List<OmObservation> observations,
final Map<String, Time> phenomenonTimes, final Map<String, TimeInstant> resultTimes,
final Map<String, AbstractFeature> features) throws OwsExceptionReport {
for (final OmObservation observation : observations) {
// phenomenonTime
final Time phenomenonTime = observation.getPhenomenonTime();
if (phenomenonTime.isReferenced()) {
observation.getValue().setPhenomenonTime(phenomenonTimes.get(phenomenonTime.getGmlId()));
}
// resultTime
final TimeInstant resultTime = observation.getResultTime();
if (resultTime.isReferenced()) {
if (resultTimes.containsKey(resultTime.getGmlId())) {
observation.setResultTime(resultTimes.get(resultTime.getGmlId()));
} else if (phenomenonTimes.containsKey(resultTime.getGmlId())) {
final Time iTime = phenomenonTimes.get(resultTime.getGmlId());
if (iTime instanceof TimeInstant) {
observation.setResultTime((TimeInstant) iTime);
} else if (iTime instanceof TimePeriod) {
final TimePeriod timePeriod = (TimePeriod) iTime;
observation.setResultTime(new TimeInstant(timePeriod.getEnd()));
} else {
throw new InvalidParameterValueException().at("observation.resultTime")
.withMessage("The time value type is not supported");
}
}
}
// featureOfInterest
final AbstractFeature featureOfInterest = observation.getObservationConstellation().getFeatureOfInterest();
if (featureOfInterest.isReferenced()) {
observation.getObservationConstellation()
.setFeatureOfInterest(features.get(featureOfInterest.getGmlId()));
}
}
}
}