package net.refractions.wkt; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import net.refractions.udig.project.ILayer; import net.refractions.udig.project.command.AbstractCommand; import net.refractions.udig.project.command.UndoableMapCommand; import org.eclipse.core.runtime.IProgressMonitor; import org.geotools.data.FeatureStore; import org.geotools.factory.CommonFactoryFinder; import org.geotools.factory.GeoTools; import org.geotools.feature.FeatureCollection; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory; import org.opengis.filter.identity.FeatureId; /** * Adds a collection of features * */ public class AddFeaturesCommand extends AbstractCommand implements UndoableMapCommand { private Collection<SimpleFeature> features; private FeatureStore<SimpleFeatureType, SimpleFeature> resource; private ILayer layer; private Set<FeatureId> addedFeatures = null; public AddFeaturesCommand( Collection<SimpleFeature> features, ILayer layer ) { this.features=features; this.layer=layer; } public Set getAddedFeatures(){ return addedFeatures; } public void run( IProgressMonitor monitor ) throws Exception { resource = layer.getResource(FeatureStore.class, monitor); if( resource == null ) return; FeatureCollection<SimpleFeatureType, SimpleFeature> c=new org.geotools.feature.collection.AdaptorFeatureCollection("addFeatureCollection",resource.getSchema()){ @Override public int size() { return 1; } @Override protected Iterator openIterator() { return features.iterator(); } @Override protected void closeIterator( Iterator close ) { } }; addedFeatures = new HashSet<FeatureId>(); List<FeatureId> features = resource.addFeatures(c); addedFeatures.addAll(features); } public String getName() { return "Add Features Command"; } public void rollback( IProgressMonitor monitor ) throws Exception { FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory(GeoTools.getDefaultHints()); Set<FeatureId> fids = new HashSet<FeatureId>(); for (Iterator<FeatureId> iterator = addedFeatures.iterator(); iterator.hasNext();) { FeatureId fId = (FeatureId) iterator.next(); fids.add(fId); } resource.removeFeatures(filterFactory.id(fids)); } public Filter getAddFeaturesAsFilter(){ FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory(GeoTools.getDefaultHints()); Set<FeatureId> fids = new HashSet<FeatureId>(); for (Iterator<FeatureId> iterator = addedFeatures.iterator(); iterator.hasNext();) { FeatureId fId = (FeatureId) iterator.next(); fids.add(fId); } return filterFactory.id(fids); } }