/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2010-2016, 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.osm;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.stream.XMLStreamException;
import org.geotoolkit.data.AbstractFeatureStore;
import org.geotoolkit.data.FeatureStoreFactory;
import org.geotoolkit.data.FeatureReader;
import org.geotoolkit.data.FeatureWriter;
import org.geotoolkit.data.memory.MemoryFeatureStore;
import org.geotoolkit.data.osm.xml.OSMXMLReader;
import org.geotoolkit.data.query.Query;
import org.geotoolkit.data.query.QueryBuilder;
import org.geotoolkit.data.query.QueryCapabilities;
import org.geotoolkit.factory.Hints;
import org.apache.sis.storage.DataStoreException;
import org.opengis.util.GenericName;
import org.opengis.filter.Filter;
import org.opengis.filter.identity.FeatureId;
import org.opengis.parameter.ParameterValueGroup;
import static org.geotoolkit.data.osm.model.OSMModelConstants.*;
import org.geotoolkit.storage.DataStores;
import org.opengis.feature.Feature;
import org.opengis.feature.FeatureType;
/**
* OSM DataStore, holds 3 feature types.
* - Node
* - Way
* - relation
*
* @author Johann Sorel (Geomatys)
* @module
*/
public class OSMMemoryFeatureStore extends AbstractFeatureStore{
private final MemoryFeatureStore memoryStore;
public OSMMemoryFeatureStore(final ParameterValueGroup params,
final Object input) throws IOException, XMLStreamException, DataStoreException{
super(params);
memoryStore = new MemoryFeatureStore();
memoryStore.createFeatureType(TYPE_NODE);
memoryStore.createFeatureType(TYPE_WAY);
memoryStore.createFeatureType(TYPE_RELATION);
final OSMXMLReader reader = new OSMXMLReader();
try{
reader.setInput(input);
while(reader.hasNext()){
final Object obj = reader.next();
if(obj instanceof Feature){
final Feature feature = (Feature) obj;
final FeatureType ft = feature.getType();
if(!memoryStore.getNames().contains(ft.getName())){
memoryStore.createFeatureType(ft);
}
memoryStore.addFeatures(ft.getName().toString(), Collections.singleton(feature));
}
}
}finally{
reader.dispose();
}
}
@Override
public FeatureStoreFactory getFactory() {
return (FeatureStoreFactory) DataStores.getFactoryById(OSMMemoryFeatureStoreFactory.NAME);
}
@Override
public Set<GenericName> getNames() throws DataStoreException {
return memoryStore.getNames();
}
@Override
public FeatureType getFeatureType(final String typeName) throws DataStoreException {
return memoryStore.getFeatureType(typeName);
}
@Override
public FeatureReader getFeatureReader(final Query query) throws DataStoreException {
final FeatureType ft = getFeatureType(query.getTypeName());
FeatureReader fr = memoryStore.getFeatureReader(QueryBuilder.all(query.getTypeName()));
return handleRemaining(fr, query);
}
@Override
public FeatureWriter getFeatureWriter(Query query) throws DataStoreException {
throw new UnsupportedOperationException("Not yet.");
}
////////////////////////////////////////////////////////////////////////////
// FALLTHROUGHT OR NOT IMPLEMENTED /////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
@Override
public QueryCapabilities getQueryCapabilities() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void createFeatureType(final FeatureType featureType) throws DataStoreException {
throw new DataStoreException("New schema creation not allowed on GPX files.");
}
@Override
public void deleteFeatureType(final String typeName) throws DataStoreException {
throw new DataStoreException("Delete schema not allowed on GPX files.");
}
@Override
public void updateFeatureType(final FeatureType featureType) throws DataStoreException {
throw new DataStoreException("Update schema not allowed on GPX files.");
}
@Override
public List<FeatureId> addFeatures(final String groupName, final Collection<? extends Feature> newFeatures,
final Hints hints) throws DataStoreException {
return handleAddWithFeatureWriter(groupName, newFeatures, hints);
}
@Override
public void updateFeatures(final String groupName, final Filter filter, final Map<String, ? extends Object> values) throws DataStoreException {
handleUpdateWithFeatureWriter(groupName, filter, values);
}
@Override
public void removeFeatures(final String groupName, final Filter filter) throws DataStoreException {
handleRemoveWithFeatureWriter(groupName, filter);
}
@Override
public void refreshMetaModel() {
}
}