Improve JCR and GIS
[lgpl/argeo-commons.git] / gis / runtime / org.argeo.gis.geotools / src / main / java / org / argeo / geotools / GeoToolsUtils.java
index 88ab84995621b21abfdac286fab9fc32a4d70847..c154f4b97920d410874d32faa851c0487bf6df14 100644 (file)
@@ -1,18 +1,34 @@
 package org.argeo.geotools;
 
 import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.geotools.data.DataStore;
 import org.geotools.data.FeatureSource;
 import org.geotools.data.FeatureStore;
+import org.geotools.feature.FeatureIterator;
+import org.geotools.filter.FilterFactoryImpl;
 import org.opengis.feature.simple.SimpleFeature;
 import org.opengis.feature.simple.SimpleFeatureType;
 import org.opengis.feature.type.Name;
+import org.opengis.filter.Filter;
+import org.opengis.filter.FilterFactory2;
+import org.opengis.filter.identity.FeatureId;
 
 /** Utilities related to the GeoTools framework */
 public class GeoToolsUtils {
 
+       private final static Log log = LogFactory.getLog(GeoToolsUtils.class);
+
+       // TODO: use common factory finder?
+       private static FilterFactory2 filterFactory = new FilterFactoryImpl();
+
        /** Opens a read/write feature store */
        public static FeatureStore<SimpleFeatureType, SimpleFeature> getFeatureStore(
                        DataStore dataStore, Name name) {
@@ -45,4 +61,45 @@ public class GeoToolsUtils {
                        }
                }
        }
+
+       public static FilterFactory2 ff() {
+               return filterFactory;
+       }
+
+       public static SimpleFeature querySingleFeature(
+                       FeatureSource<SimpleFeatureType, SimpleFeature> featureSource,
+                       String featureId) {
+               Set<FeatureId> ids = new HashSet<FeatureId>();
+               ids.add(ff().featureId(featureId));
+               Filter filter = ff().id(ids);
+               FeatureIterator<SimpleFeature> it = null;
+               try {
+                       it = featureSource.getFeatures(filter).features();
+                       if (!it.hasNext())
+                               return null;
+                       else {
+                               SimpleFeature feature = it.next();
+                               if (it.hasNext())
+                                       log.warn("More than one feature for feature id "
+                                                       + featureId + " in feature source "
+                                                       + featureSource.getName());
+                               return feature;
+                       }
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot extract single feature "
+                                       + featureId + " from feature source "
+                                       + featureSource.getName(), e);
+               } finally {
+                       closeQuietly(it);
+               }
+       }
+
+       public static void closeQuietly(FeatureIterator<?> featureIterator) {
+               if (featureIterator != null)
+                       try {
+                               featureIterator.close();
+                       } catch (Exception e) {
+                               // silent
+                       }
+       }
 }