]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - gis/runtime/org.argeo.gis.geotools/src/main/java/org/argeo/geotools/osgi/GisResourcesActivator.java
Improve GIS
[lgpl/argeo-commons.git] / gis / runtime / org.argeo.gis.geotools / src / main / java / org / argeo / geotools / osgi / GisResourcesActivator.java
diff --git a/gis/runtime/org.argeo.gis.geotools/src/main/java/org/argeo/geotools/osgi/GisResourcesActivator.java b/gis/runtime/org.argeo.gis.geotools/src/main/java/org/argeo/geotools/osgi/GisResourcesActivator.java
new file mode 100644 (file)
index 0000000..e904df7
--- /dev/null
@@ -0,0 +1,67 @@
+package org.argeo.geotools.osgi;
+
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.geotools.GeoToolsConstants;
+import org.geotools.data.DataStore;
+import org.geotools.data.FileDataStoreFinder;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Publishes as OSGi services (typically {@link DataStore}) resources contained
+ * or references within the bundle declaring this activator.
+ */
+public class GisResourcesActivator implements BundleActivator {
+       private final static Log log = LogFactory
+                       .getLog(GisResourcesActivator.class);
+
+       /**
+        * Keep track of the registered datastores in order to dispose them when the
+        * bundle is stopped.
+        */
+       private Map<String, DataStore> registeredDataStores = new HashMap<String, DataStore>();
+
+       @SuppressWarnings("unchecked")
+       public void start(BundleContext context) throws Exception {
+               Bundle bundle = context.getBundle();
+
+               // TODO deal with other data types
+               // shapefiles
+               Enumeration<URL> resources = bundle.findEntries("/", "*.shp", true);
+               while (resources.hasMoreElements()) {
+                       URL url = resources.nextElement();
+                       DataStore ds = FileDataStoreFinder.getDataStore(url);
+                       Properties props = new Properties();
+                       String alias = url.getPath();
+                       props.setProperty(GeoToolsConstants.ALIAS_KEY, alias);
+                       context.registerService(DataStore.class.getName(), ds, props);
+                       registeredDataStores.put(alias, ds);
+                       if (log.isDebugEnabled())
+                               log.debug("Registered data store " + alias + ": " + ds);
+               }
+       }
+
+       public void stop(BundleContext context) throws Exception {
+               for (String alias : registeredDataStores.keySet()) {
+                       DataStore ds = registeredDataStores.get(alias);
+                       try {
+                               ds.dispose();
+                               if (log.isDebugEnabled())
+                                       log.debug("Disposed data store " + alias + ": " + ds);
+                       } catch (Exception e) {
+                               log.warn("Could not dispose data store " + ds + ": "
+                                               + e.getMessage());
+                       }
+               }
+
+       }
+
+}