/*
* 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.bean;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.sis.storage.DataStoreException;
import org.apache.sis.storage.IllegalNameException;
import org.geotoolkit.data.AbstractFeatureStore;
import org.geotoolkit.data.FeatureReader;
import org.geotoolkit.data.FeatureStoreFactory;
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.opengis.util.GenericName;
import org.geotoolkit.storage.StorageEvent;
import org.geotoolkit.storage.StorageListener;
import org.opengis.feature.Feature;
import org.opengis.feature.FeatureType;
import org.opengis.filter.Filter;
import org.opengis.filter.identity.FeatureId;
/**
* A BeanStore decorate collections of bean objects as FeatureCollections.
* Only reading operations are supported.
*
* @author Johann Sorel (Geomatys)
*/
public class BeanStore extends AbstractFeatureStore implements StorageListener{
private static final QueryCapabilities CAPABILITIES = new DefaultQueryCapabilities(false);
/**
* A FeatureSupplier provides access to an iterable of bean objects.
* TODO JDK8 : replace with Supplier
*/
public static interface FeatureSupplier{
Iterable get();
}
private final GenericNameIndex<BeanFeatureSupplier> types = new GenericNameIndex<>();
public BeanStore(BeanFeatureSupplier ... types) throws IllegalNameException {
super(null);
for(BeanFeatureSupplier bt : types){
this.types.add(bt.mapping.featureType.getName(), bt);
//catch events and propage them
bt.addStorageListener(this);
}
}
public Collection<BeanFeatureSupplier> getBeanSuppliers(){
return Collections.unmodifiableCollection(types.getValues());
}
public BeanFeatureSupplier getBeanSupplier(String typeName) throws DataStoreException{
typeCheck(typeName);
return types.get(typeName);
}
@Override
public FeatureStoreFactory getFactory() {
return null;
}
@Override
public Set<GenericName> getNames() throws DataStoreException {
return types.getNames();
}
@Override
public FeatureType getFeatureType(String typeName) throws DataStoreException {
typeCheck(typeName);
return types.get(typeName).mapping.featureType;
}
@Override
public FeatureReader getFeatureReader(Query query) throws DataStoreException {
typeCheck(query.getTypeName());
final BeanFeatureSupplier bt = types.get(query.getTypeName());
final Iterable candidates = bt.supplier.get();
final BeanFeature.Mapping mapping = bt.mapping;
final FeatureReader reader = new BeanFeatureReader(mapping, candidates);
return handleRemaining(reader, query);
}
@Override
public QueryCapabilities getQueryCapabilities() {
return CAPABILITIES;
}
@Override
public List<FeatureId> addFeatures(String groupName, Collection<? extends Feature> newFeatures, Hints hints) throws DataStoreException {
throw new DataStoreException("Not supported.");
}
@Override
public void updateFeatures(String groupName, Filter filter, Map<String, ?> values) throws DataStoreException {
throw new DataStoreException("Not supported.");
}
@Override
public void removeFeatures(String groupName, Filter filter) throws DataStoreException {
throw new DataStoreException("Not supported.");
}
@Override
public FeatureWriter getFeatureWriter(Query query) throws DataStoreException {
throw new DataStoreException("Not supported.");
}
@Override
public void refreshMetaModel() {
fireFeaturesAdded(null, null);
}
////////////////////////////////////////////////////////////////////////////
// BEAN SUPPLIER EVENTS ////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
@Override
public void structureChanged(StorageEvent event) {
sendStructureEvent(event.copy(this));
}
@Override
public void contentChanged(StorageEvent event) {
sendContentEvent(event.copy(this));
}
////////////////////////////////////////////////////////////////////////////
// NOT SUPPORTED ///////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
@Override
public void createFeatureType(FeatureType featureType) throws DataStoreException {
throw new DataStoreException("Not supported.");
}
@Override
public void updateFeatureType(FeatureType featureType) throws DataStoreException {
throw new DataStoreException("Not supported.");
}
@Override
public void deleteFeatureType(String typeName) throws DataStoreException {
throw new DataStoreException("Not supported.");
}
}