/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2014, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotoolkit.data.om.xml;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.xml.namespace.QName;
import org.apache.sis.storage.DataStoreException;
import org.geotoolkit.gml.xml.AbstractGeometry;
import org.geotoolkit.gml.xml.FeatureProperty;
import org.geotoolkit.observation.ObservationReader;
import org.geotoolkit.observation.xml.*;
import org.geotoolkit.observation.xml.Process;
import org.geotoolkit.sos.netcdf.ExtractionResult;
import org.geotoolkit.sos.netcdf.GeoSpatialBound;
import org.geotoolkit.sos.xml.ObservationOffering;
import org.geotoolkit.sos.xml.ResponseModeType;
import org.geotoolkit.swe.xml.PhenomenonProperty;
import org.opengis.observation.Observation;
import org.opengis.observation.ObservationCollection;
import org.opengis.observation.sampling.SamplingFeature;
import org.opengis.temporal.Instant;
import org.opengis.temporal.Period;
import org.opengis.temporal.TemporalGeometricPrimitive;
import org.opengis.temporal.TemporalObject;
import org.opengis.temporal.TemporalPrimitive;
/**
*
* @author Guilhem Legal (Geomatys)
*/
public class XmlObservationReader implements ObservationReader {
private final List<Object> xmlObjects;
public XmlObservationReader(final List<Object> xmlObjects) {
this.xmlObjects = xmlObjects;
}
@Override
public Collection<String> getProcedureNames() throws DataStoreException {
final Set<String> names = new HashSet<>();
for (Object xmlObject : xmlObjects) {
if (xmlObject instanceof ObservationCollection) {
final ObservationCollection collection = (ObservationCollection)xmlObject;
for (Observation obs : collection.getMember()) {
final org.geotoolkit.observation.xml.Process process = (Process)obs.getProcedure();
names.add(process.getHref());
}
} else if (xmlObject instanceof Observation) {
final Observation obs = (Observation)xmlObject;
final Process process = (Process)obs.getProcedure();
names.add(process.getHref());
}
}
return names;
}
@Override
public Collection<String> getPhenomenonNames() throws DataStoreException {
final Set<String> phenomenons = new HashSet<>();
for (Object xmlObject : xmlObjects) {
if (xmlObject instanceof ObservationCollection) {
final ObservationCollection collection = (ObservationCollection)xmlObject;
for (Observation obs : collection.getMember()) {
final AbstractObservation o = (AbstractObservation)obs;
final PhenomenonProperty phenProp = o.getPropertyObservedProperty();
phenomenons.addAll(XmlObservationUtils.getPhenomenonsFields(phenProp));
}
} else if (xmlObject instanceof AbstractObservation) {
final AbstractObservation obs = (AbstractObservation)xmlObject;
final PhenomenonProperty phenProp = obs.getPropertyObservedProperty();
phenomenons.addAll(XmlObservationUtils.getPhenomenonsFields(phenProp));
}
}
return phenomenons;
}
@Override
public Collection<String> getProceduresForPhenomenon(final String observedProperty) throws DataStoreException {
final Set<String> procedures = new HashSet<>();
for (Object xmlObject : xmlObjects) {
if (xmlObject instanceof ObservationCollection) {
final ObservationCollection collection = (ObservationCollection)xmlObject;
for (Observation obs : collection.getMember()) {
final AbstractObservation o = (AbstractObservation)obs;
final PhenomenonProperty phenProp = o.getPropertyObservedProperty();
final List<String> phen = XmlObservationUtils.getPhenomenonsFields(phenProp);
if (phen.contains(observedProperty)) {
procedures.add(o.getProcedure().getHref());
}
}
} else if (xmlObject instanceof AbstractObservation) {
final AbstractObservation obs = (AbstractObservation)xmlObject;
final PhenomenonProperty phenProp = obs.getPropertyObservedProperty();
final List<String> phen = XmlObservationUtils.getPhenomenonsFields(phenProp);
if (phen.contains(observedProperty)) {
procedures.add(obs.getProcedure().getHref());
}
}
}
return procedures;
}
@Override
public Collection<String> getPhenomenonsForProcedure(final String sensorID) throws DataStoreException {
final Set<String> phenomenons = new HashSet<>();
for (Object xmlObject : xmlObjects) {
if (xmlObject instanceof ObservationCollection) {
final ObservationCollection collection = (ObservationCollection)xmlObject;
for (Observation obs : collection.getMember()) {
final AbstractObservation o = (AbstractObservation)obs;
if (o.getProcedure().getHref().equals(sensorID)) {
final PhenomenonProperty phenProp = o.getPropertyObservedProperty();
phenomenons.addAll(XmlObservationUtils.getPhenomenonsFields(phenProp));
}
}
} else if (xmlObject instanceof AbstractObservation) {
final AbstractObservation obs = (AbstractObservation)xmlObject;
if (obs.getProcedure().getHref().equals(sensorID)) {
final PhenomenonProperty phenProp = obs.getPropertyObservedProperty();
phenomenons.addAll(XmlObservationUtils.getPhenomenonsFields(phenProp));
}
}
}
return phenomenons;
}
@Override
public TemporalGeometricPrimitive getTimeForProcedure(final String version, final String sensorID) throws DataStoreException {
final ExtractionResult result = new ExtractionResult();
result.spatialBound.initBoundary();
for (Object xmlObject : xmlObjects) {
if (xmlObject instanceof ObservationCollection) {
final ObservationCollection collection = (ObservationCollection)xmlObject;
for (Observation obs : collection.getMember()) {
final AbstractObservation o = (AbstractObservation) obs;
if (o.getProcedure().getHref().equals(sensorID)) {
appendTime(obs.getSamplingTime(), result.spatialBound);
}
}
} else if (xmlObject instanceof AbstractObservation) {
final AbstractObservation obs = (AbstractObservation)xmlObject;
if (obs.getProcedure().getHref().equals(sensorID)) {
appendTime(obs.getSamplingTime(), result.spatialBound);
}
}
}
return result.spatialBound.getTimeObject("2.0.0");
}
private void appendTime(final TemporalObject time, final GeoSpatialBound spatialBound) {
if (time instanceof Instant) {
final Instant i = (Instant) time;
spatialBound.addDate(i.getDate());
} else if (time instanceof Period) {
final Period p = (Period) time;
spatialBound.addDate(p.getBeginning().getDate());
spatialBound.addDate(p.getEnding().getDate());
}
}
@Override
public boolean existPhenomenon(final String phenomenonName) throws DataStoreException {
return getPhenomenonNames().contains(phenomenonName);
}
@Override
public Collection<String> getFeatureOfInterestNames() throws DataStoreException {
final Set<String> featureOfInterest = new HashSet<>();
for (Object xmlObject : xmlObjects) {
if (xmlObject instanceof ObservationCollection) {
final ObservationCollection collection = (ObservationCollection)xmlObject;
for (Observation obs : collection.getMember()) {
final AbstractObservation o = (AbstractObservation)obs;
final FeatureProperty foiProp = o.getPropertyFeatureOfInterest();
featureOfInterest.add(XmlObservationUtils.getFOIName(foiProp));
}
} else if (xmlObject instanceof AbstractObservation) {
final AbstractObservation obs = (AbstractObservation)xmlObject;
final FeatureProperty foiProp = obs.getPropertyFeatureOfInterest();
featureOfInterest.add(XmlObservationUtils.getFOIName(foiProp));
}
}
return featureOfInterest;
}
@Override
public SamplingFeature getFeatureOfInterest(final String samplingFeatureName, final String version) throws DataStoreException {
for (Object xmlObject : xmlObjects) {
if (xmlObject instanceof ObservationCollection) {
final ObservationCollection collection = (ObservationCollection)xmlObject;
for (Observation obs : collection.getMember()) {
final AbstractObservation o = (AbstractObservation)obs;
final FeatureProperty foiProp = o.getPropertyFeatureOfInterest();
if (foiProp != null && foiProp.getAbstractFeature() != null && foiProp.getAbstractFeature().getId() != null &&
foiProp.getAbstractFeature().getId().equals(samplingFeatureName)) {
return (SamplingFeature) foiProp.getAbstractFeature();
}
}
} else if (xmlObject instanceof AbstractObservation) {
final AbstractObservation obs = (AbstractObservation)xmlObject;
final FeatureProperty foiProp = obs.getPropertyFeatureOfInterest();
if (foiProp != null && foiProp.getAbstractFeature() != null && foiProp.getAbstractFeature().getId() != null &&
foiProp.getAbstractFeature().getId().equals(samplingFeatureName)) {
return (SamplingFeature) foiProp.getAbstractFeature();
}
}
}
return null;
}
@Override
public TemporalPrimitive getFeatureOfInterestTime(final String samplingFeatureName, final String version) throws DataStoreException {
throw new DataStoreException("Not supported yet in this implementation.");
}
@Override
public Observation getObservation(final String identifier, final QName resultModel, final ResponseModeType mode, final String version) throws DataStoreException {
for (Object xmlObject : xmlObjects) {
if (xmlObject instanceof ObservationCollection) {
final ObservationCollection collection = (ObservationCollection)xmlObject;
for (Observation obs : collection.getMember()) {
final AbstractObservation o = (AbstractObservation)obs;
if (o.getId().equals(identifier)) {
return o;
}
}
} else if (xmlObject instanceof AbstractObservation) {
final AbstractObservation o = (AbstractObservation)xmlObject;
if (o.getId().equals(identifier)) {
return o;
}
}
}
return null;
}
@Override
public Object getResult(final String identifier, final QName resultModel, final String version) throws DataStoreException {
throw new DataStoreException("Not supported yet in this implementation.");
}
@Override
public boolean existProcedure(final String href) throws DataStoreException {
return getProcedureNames().contains(href);
}
@Override
public String getNewObservationId() throws DataStoreException {
throw new DataStoreException("Not supported in this implementation.");
}
@Override
public List<String> getEventTime() throws DataStoreException {
throw new DataStoreException("Not supported yet in this implementation.");
}
@Override
public List<ResponseModeType> getResponseModes() throws DataStoreException {
return Arrays.asList(ResponseModeType.INLINE);
}
@Override
public List<String> getResponseFormats() throws DataStoreException {
return Arrays.asList(XmlObservationUtils.RESPONSE_FORMAT_V100, XmlObservationUtils.RESPONSE_FORMAT_V200);
}
@Override
public AbstractGeometry getSensorLocation(final String sensorID, final String version) throws DataStoreException {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getInfos() {
return "O&M xml file Reader 4.x";
}
@Override
public void destroy() {
// do nothing
}
@Override
public Collection<String> getOfferingNames(final String version) throws DataStoreException {
throw new DataStoreException("offerings are not handled in XML observation reader.");
}
@Override
public ObservationOffering getObservationOffering(final String offeringName, final String version) throws DataStoreException {
throw new DataStoreException("offerings are not handled in XML observation reader.");
}
@Override
public List<ObservationOffering> getObservationOfferings(final List<String> offeringNames, final String version) throws DataStoreException {
throw new DataStoreException("offerings are not handled in XML observation reader.");
}
@Override
public List<ObservationOffering> getObservationOfferings(final String version) throws DataStoreException {
throw new DataStoreException("offerings are not handled in XML observation reader.");
}
@Override
public Observation getTemplateForProcedure(final String procedure, final String version) throws DataStoreException {
throw new DataStoreException("Not supported yet in this implementation.");
}
}