/*
* 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.netcdf;
import org.geotoolkit.data.om.OMFeatureTypes;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.sis.storage.DataStoreException;
import org.geotoolkit.data.AbstractFeatureStore;
import org.geotoolkit.data.FeatureReader;
import org.geotoolkit.data.FeatureWriter;
import org.geotoolkit.data.internal.GenericNameIndex;
import org.geotoolkit.data.query.DefaultQueryCapabilities;
import org.geotoolkit.data.query.Query;
import org.geotoolkit.data.query.QueryCapabilities;
import org.geotoolkit.factory.Hints;
import org.geotoolkit.nio.IOUtilities;
import org.geotoolkit.observation.ObservationFilter;
import org.geotoolkit.util.NamesExt;
import org.geotoolkit.observation.ObservationReader;
import org.geotoolkit.observation.ObservationStore;
import org.geotoolkit.observation.ObservationWriter;
import static org.geotoolkit.data.om.netcdf.NetcdfObservationStoreFactory.FILE_PATH;
import org.geotoolkit.sos.netcdf.ExtractionResult;
import org.geotoolkit.sos.netcdf.Field;
import org.geotoolkit.sos.netcdf.NCFieldAnalyze;
import org.geotoolkit.sos.netcdf.NetCDFExtractor;
import org.geotoolkit.sos.netcdf.NetCDFParsingException;
import org.geotoolkit.storage.DataFileStore;
import org.geotoolkit.storage.DataStoreFactory;
import org.geotoolkit.storage.DataStores;
import org.opengis.feature.Feature;
import org.opengis.feature.FeatureType;
import org.opengis.filter.Filter;
import org.opengis.filter.identity.FeatureId;
import org.opengis.util.GenericName;
import org.opengis.parameter.ParameterValueGroup;
import org.opengis.temporal.TemporalGeometricPrimitive;
/**
*
* @author Guilhem Legal (Geomatys)
*/
public class NetcdfObservationStore extends AbstractFeatureStore implements DataFileStore,ObservationStore {
protected final GenericNameIndex<FeatureType> types;
private static final QueryCapabilities capabilities = new DefaultQueryCapabilities(false);
private final Path dataFile;
private final NCFieldAnalyze analyze;
public NetcdfObservationStore(final ParameterValueGroup params) {
super(params);
dataFile = Paths.get((URI) params.parameter(FILE_PATH.getName().toString()).getValue());
analyze = NetCDFExtractor.analyzeResult(dataFile, null);
types = OMFeatureTypes.getFeatureTypes(IOUtilities.filenameWithoutExtension(dataFile));
}
public NetcdfObservationStore(final Path observationFile) {
super(null);
dataFile = observationFile;
analyze = NetCDFExtractor.analyzeResult(dataFile, null);
types = OMFeatureTypes.getFeatureTypes(IOUtilities.filenameWithoutExtension(dataFile));
}
@Override
public DataStoreFactory getFactory() {
return DataStores.getFactoryById(NetcdfObservationStoreFactory.NAME);
}
/**
* @return the dataFile
*/
public Path getDataFile() {
return dataFile;
}
////////////////////////////////////////////////////////////////////////////
// FEATURE STORE ///////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* {@inheritDoc }
*/
@Override
public Set<GenericName> getNames() throws DataStoreException {
return types.getNames();
}
/**
* {@inheritDoc }
*/
@Override
public FeatureType getFeatureType(final String typeName) throws DataStoreException {
typeCheck(typeName);
return types.get(typeName);
}
/**
* {@inheritDoc }
*/
@Override
public QueryCapabilities getQueryCapabilities() {
return capabilities;
}
/**
* {@inheritDoc }
*/
@Override
public void refreshMetaModel() {
}
@Override
public FeatureReader getFeatureReader(final Query query) throws DataStoreException {
final FeatureType sft = getFeatureType(query.getTypeName());
try {
return handleRemaining(new NetcdfFeatureReader(dataFile,sft), query);
} catch (NetCDFParsingException ex) {
throw new DataStoreException(ex);
}
}
/**
* {@inheritDoc }
*/
@Override
public void createFeatureType(final FeatureType featureType) throws DataStoreException {
throw new DataStoreException("Not Supported.");
}
/**
* {@inheritDoc }
*/
@Override
public void updateFeatureType(final FeatureType featureType) throws DataStoreException {
throw new DataStoreException("Not Supported.");
}
/**
* {@inheritDoc }
*/
@Override
public void deleteFeatureType(final String typeName) throws DataStoreException {
throw new DataStoreException("Not Supported.");
}
/**
* {@inheritDoc }
*/
@Override
public List<FeatureId> addFeatures(String groupName, Collection<? extends Feature> newFeatures, Hints hints) throws DataStoreException {
throw new DataStoreException("Not Supported.");
}
/**
* {@inheritDoc }
*/
@Override
public void updateFeatures(final String groupName, final Filter filter, final Map<String, ? extends Object> values) throws DataStoreException {
throw new DataStoreException("Not Supported.");
}
/**
* {@inheritDoc }
*/
@Override
public void removeFeatures(String groupName, Filter filter) throws DataStoreException {
throw new DataStoreException("Not Supported.");
}
/**
* {@inheritDoc }
*/
@Override
public FeatureWriter getFeatureWriter(Query query) throws DataStoreException {
throw new DataStoreException("Not Supported.");
}
////////////////////////////////////////////////////////////////////////////
// OBSERVATION STORE ///////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
@Override
public Set<GenericName> getProcedureNames() {
final Set<GenericName> names = new HashSet<>();
names.add(NamesExt.create(getProcedureID()));
return names;
}
private String getProcedureID() {
return IOUtilities.filenameWithoutExtension(dataFile);
}
@Override
public ExtractionResult getResults() throws DataStoreException {
try {
return NetCDFExtractor.getObservationFromNetCDF(analyze, getProcedureID(), null);
} catch (NetCDFParsingException ex) {
throw new DataStoreException(ex);
}
}
@Override
public ExtractionResult getResults(final List<String> sensorIDs) throws DataStoreException {
try {
return NetCDFExtractor.getObservationFromNetCDF(analyze, getProcedureID(), sensorIDs);
} catch (NetCDFParsingException ex) {
throw new DataStoreException(ex);
}
}
@Override
public ExtractionResult getResults(final String affectedSensorID, final List<String> sensorIDs) throws DataStoreException {
try {
return NetCDFExtractor.getObservationFromNetCDF(analyze, affectedSensorID, sensorIDs);
} catch (NetCDFParsingException ex) {
throw new DataStoreException(ex);
}
}
@Override
public void close() throws DataStoreException {
// do nothing
}
@Override
public Set<String> getPhenomenonNames() {
final Set<String> phenomenons = new HashSet<>();
for (Field field : analyze.phenfields) {
phenomenons.add(field.label);
}
return phenomenons;
}
@Override
public TemporalGeometricPrimitive getTemporalBounds() throws DataStoreException {
try {
final ExtractionResult result = NetCDFExtractor.getObservationFromNetCDF(analyze, getProcedureID(), null);
if (result != null && result.spatialBound != null) {
return result.spatialBound.getTimeObject("2.0.0");
}
return null;
} catch (NetCDFParsingException ex) {
throw new DataStoreException(ex);
}
}
/**
* {@inheritDoc }
*/
@Override
public Path[] getDataFiles() throws DataStoreException {
return new Path[]{dataFile};
}
/**
* {@inheritDoc }
*/
@Override
public ObservationReader getReader() {
return new NetcdfObservationReader(dataFile, analyze);
}
@Override
public List<ExtractionResult.ProcedureTree> getProcedures() throws DataStoreException {
try {
return NetCDFExtractor.getProcedures(analyze, getProcedureID(), null);
} catch (NetCDFParsingException ex) {
throw new DataStoreException(ex);
}
}
/**
* {@inheritDoc }
*/
@Override
public ObservationFilter getFilter() {
throw new UnsupportedOperationException("Filtering is not supported on this observation store.");
}
/**
* {@inheritDoc }
*/
@Override
public ObservationWriter getWriter() {
throw new UnsupportedOperationException("Writing is not supported on this observation store.");
}
/**
* {@inheritDoc }
*/
@Override
public ObservationFilter cloneObservationFilter(ObservationFilter toClone) {
throw new UnsupportedOperationException("Filtering is not supported on this observation store.");
}
}