/**
* 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.request;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.n52.sos.ogc.filter.ComparisonFilter;
import org.n52.sos.ogc.filter.Filter;
import org.n52.sos.ogc.filter.SpatialFilter;
import org.n52.sos.ogc.filter.TemporalFilter;
import org.n52.sos.ogc.gml.time.TimeInstant;
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.SosConstants.SosIndeterminateTime;
import org.n52.sos.response.AbstractObservationResponse;
import org.n52.sos.response.GetObservationResponse;
import org.n52.sos.util.CollectionHelper;
import org.n52.sos.util.StringHelper;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/**
* SOS GetObservation request
*
* @since 4.0.0
*/
public class GetObservationRequest extends AbstractObservationRequest implements SpatialFeatureQueryRequest {
/**
* Request as String
*/
private String requestString;
/**
* Offerings list
*/
private List<String> offerings = Lists.newLinkedList();
/**
* Temporal filters list
*/
private List<TemporalFilter> temporalFilters = Lists.newLinkedList();
/**
* Procedures list
*/
private List<String> procedures = Lists.newLinkedList();
/**
* ObservedProperties list
*/
private List<String> observedProperties = Lists.newLinkedList();
/**
* FOI identifiers list
*/
private List<String> featureIdentifiers = Lists.newLinkedList();
/**
* Spatial filters list
*/
private SpatialFilter spatialFilter;
/**
* Result filters list
*/
@Deprecated
private ComparisonFilter result;
@SuppressWarnings("rawtypes")
private Filter resultFilter;
private Map<String, String> namespaces = Maps.newHashMap();
private boolean mergeObservationValues = false;
/*
* (non-Javadoc)
*
* @see org.n52.sos.request.AbstractSosRequest#getOperationName()
*/
@Override
public String getOperationName() {
return SosConstants.Operations.GetObservation.name();
}
/**
* Get temporal filters
*
* @return temporal filters
*/
public List<TemporalFilter> getTemporalFilters() {
return temporalFilters;
}
/**
* Set temporal filters
*
* @param temporalFilters
* temporal filters
*/
public void setTemporalFilters(List<TemporalFilter> temporalFilters) {
this.temporalFilters = temporalFilters;
}
/**
* Get FOI identifiers
*
* @return FOI identifiers
*/
@Override
public List<String> getFeatureIdentifiers() {
return featureIdentifiers;
}
/**
* Set FOI identifiers
*
* @param featureIdentifiers
* FOI identifiers
*/
@Override
public void setFeatureIdentifiers(List<String> featureIdentifiers) {
this.featureIdentifiers = featureIdentifiers;
}
/**
* Get observableProperties
*
* @return observableProperties
*/
public List<String> getObservedProperties() {
return observedProperties;
}
/**
* Set observedProperties
*
* @param observedProperties
* observedProperties
*/
public void setObservedProperties(List<String> observedProperties) {
this.observedProperties = observedProperties;
}
/**
* Get offerings
*
* @return offerings
*/
public List<String> getOfferings() {
return offerings;
}
/**
* Set offerings
*
* @param offerings
* offerings
*/
public void setOfferings(List<String> offerings) {
this.offerings = offerings;
}
/**
* Get procedures
*
* @return procedures
*/
public List<String> getProcedures() {
return procedures;
}
/**
* Set procedures
*
* @param procedures
* procedures
*/
public void setProcedures(List<String> procedures) {
this.procedures = procedures;
}
/**
* Get result filters
*
* @return result filters
*/
@Deprecated
public ComparisonFilter getResult() {
return result;
}
/**
* Set result filters
*
* @param result
* result filters
*/
@Deprecated
public void setResult(ComparisonFilter result) {
this.result = result;
}
/**
* Get result filter(s)
*
* @return result filter(s)
*/
@SuppressWarnings("rawtypes")
public Filter getResultFilter() {
return resultFilter;
}
/**
* Add result filter(s)
*
* @param result
* result filter(s)
*/
@SuppressWarnings("rawtypes")
public void setResultFilter(Filter resultFilter) {
this.resultFilter = resultFilter;
}
/**
* Check if a result filter is set
*
* @return <code>true</code>, if a result filter is set
*/
public boolean isSetResultFilter() {
return getResultFilter() != null;
}
/**
* Get request as String
*
* @return request as String
*/
public String getRequestString() {
return requestString;
}
/**
* Set request as String
*
* @param requestString
* request as String
*/
public void setRequestString(String requestString) {
this.requestString = requestString;
}
/**
* Get spatial filter
*
* @return spatial filter
*/
@Override
public SpatialFilter getSpatialFilter() {
return spatialFilter;
}
/**
* Set spatial filter
*
* @param resultSpatialFilter
* spatial filter
*/
@Override
public void setSpatialFilter(SpatialFilter resultSpatialFilter) {
this.spatialFilter = resultSpatialFilter;
}
/**
* Create a copy of this request with defined observableProperties
*
* @param obsProps
* defined observableProperties
* @return SOS GetObservation request copy
*/
public GetObservationRequest copyOf(List<String> obsProps) {
GetObservationRequest res = new GetObservationRequest();
super.copyOf(res);
res.setTemporalFilters(this.temporalFilters);
res.setObservedProperties(obsProps);
res.setOfferings(this.offerings);
res.setProcedures(this.procedures);
res.setResponseFormat(getResponseFormat());
res.setResponseMode(getResponseMode());
res.setSpatialFilter(this.spatialFilter);
res.setResult(this.result);
res.setResultModel(getResultModel());
res.setFeatureIdentifiers(this.featureIdentifiers);
res.setService(this.getService());
res.setRequestString(this.requestString);
return res;
}
public void setNamespaces(Map<String, String> namespaces) {
this.namespaces = namespaces;
}
public Map<String, String> getNamespaces() {
return namespaces;
}
public boolean isSetOffering() {
if (offerings != null && !offerings.isEmpty()) {
return true;
}
return false;
}
public boolean isSetObservableProperty() {
if (observedProperties != null && !observedProperties.isEmpty()) {
return true;
}
return false;
}
public boolean isSetProcedure() {
if (procedures != null && !procedures.isEmpty()) {
return true;
}
return false;
}
@Override
public boolean isSetFeatureOfInterest() {
if (featureIdentifiers != null && !featureIdentifiers.isEmpty()) {
return true;
}
return false;
}
public boolean isSetTemporalFilter() {
if (temporalFilters != null && !temporalFilters.isEmpty()) {
return true;
}
return false;
}
@Override
public boolean isSetSpatialFilter() {
if (spatialFilter != null) {
return true;
}
return false;
}
public boolean hasFirstLatestTemporalFilter() {
for (TemporalFilter temporalFilter : temporalFilters) {
if (temporalFilter.getTime() instanceof TimeInstant) {
TimeInstant ti = (TimeInstant) temporalFilter.getTime();
if (ti.isSetSosIndeterminateTime()) {
return true;
}
}
}
return false;
}
public List<SosIndeterminateTime> getFirstLatestTemporalFilter() {
List<SosIndeterminateTime> tf = new LinkedList<SosIndeterminateTime>();
for (TemporalFilter temporalFilter : temporalFilters) {
if (temporalFilter.getTime() instanceof TimeInstant) {
TimeInstant ti = (TimeInstant) temporalFilter.getTime();
if (ti.isSetSosIndeterminateTime()) {
tf.add(ti.getSosIndeterminateTime());
}
}
}
return tf;
}
public List<TemporalFilter> getNotFirstLatestTemporalFilter() {
List<TemporalFilter> tf = new LinkedList<TemporalFilter>();
for (TemporalFilter temporalFilter : temporalFilters) {
if (temporalFilter.getTime() instanceof TimeInstant) {
TimeInstant ti = (TimeInstant) temporalFilter.getTime();
if (!ti.isSetSosIndeterminateTime()) {
tf.add(temporalFilter);
}
} else {
tf.add(temporalFilter);
}
}
return tf;
}
public boolean hasTemporalFilters() {
return temporalFilters != null && !temporalFilters.isEmpty();
}
public boolean isEmpty() {
return !isSetOffering() && !isSetObservableProperty() && !isSetProcedure() && !isSetFeatureOfInterest()
&& !isSetTemporalFilter() && !isSetSpatialFilter();
}
@Override
public boolean hasSpatialFilteringProfileSpatialFilter() {
return isSetSpatialFilter()
&& getSpatialFilter().getValueReference().equals(
Sos2Constants.VALUE_REFERENCE_SPATIAL_FILTERING_PROFILE);
}
public boolean isSetRequestString() {
return StringHelper.isNotEmpty(getRequestString());
}
public boolean isSetResult() {
return getResult() != null;
}
public boolean isSetNamespaces() {
return CollectionHelper.isNotEmpty(getNamespaces());
}
@Override
public AbstractObservationResponse getResponse() throws OwsExceptionReport {
return (GetObservationResponse) new GetObservationResponse().set(this);
}
public void setMergeObservationValues(boolean mergeObservationValues) {
this.mergeObservationValues = mergeObservationValues;
}
public boolean isSetMergeObservationValues(){
return mergeObservationValues;
}
}