Revision: 6550
http://sourceforge.net/p/jump-pilot/code/6550
Author: edso
Date: 2020-09-27 20:31:05 +0000 (Sun, 27 Sep 2020)
Log Message:
-----------
add some utility method needed to close db connections if layer is removed
Modified Paths:
--------------
core/trunk/src/com/vividsolutions/jump/workbench/datastore/ConnectionManager.java
Modified:
core/trunk/src/com/vividsolutions/jump/workbench/datastore/ConnectionManager.java
===================================================================
---
core/trunk/src/com/vividsolutions/jump/workbench/datastore/ConnectionManager.java
2020-09-27 20:14:34 UTC (rev 6549)
+++
core/trunk/src/com/vividsolutions/jump/workbench/datastore/ConnectionManager.java
2020-09-27 20:31:05 UTC (rev 6550)
@@ -8,6 +8,8 @@
import java.util.List;
import java.util.Map;
+import javax.swing.JFrame;
+
import com.vividsolutions.jump.datastore.DataStoreConnection;
import com.vividsolutions.jump.datastore.DataStoreDriver;
import com.vividsolutions.jump.datastore.DataStoreException;
@@ -14,17 +16,17 @@
import com.vividsolutions.jump.datastore.DataStoreMetadata;
import com.vividsolutions.jump.datastore.Query;
import com.vividsolutions.jump.datastore.SpatialReferenceSystemID;
+import com.vividsolutions.jump.datastore.spatialdatabases.SpatialDSLayer;
import
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesSQLBuilder;
import com.vividsolutions.jump.io.FeatureInputStream;
import com.vividsolutions.jump.util.Blackboard;
+import com.vividsolutions.jump.workbench.Logger;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.ui.ApplicationExitHandler;
+import com.vividsolutions.jump.workbench.ui.TaskFrame;
import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn;
+import
com.vividsolutions.jump.workbench.ui.plugin.datastore.DataStoreQueryDataSource;
-import java.sql.Connection;
-
-import javax.swing.JFrame;
-
/**
* Reuses existing connections where possible.
*/
@@ -74,11 +76,7 @@
context.getWorkbench().getFrame()
.addApplicationExitHandler(new ApplicationExitHandler() {
public void exitApplication(JFrame mainFrame) {
- try {
closeConnections();
- } catch (DataStoreException e) {
- throw new RuntimeException(e);
- }
}
});
}
@@ -86,14 +84,14 @@
private Map<ConnectionDescriptor,DataStoreConnection>
connectionDescriptorToConnectionMap =
new HashMap<>();
- public DataStoreConnection getOpenConnection(
- ConnectionDescriptor connectionDescriptor) throws Exception {
- if (getConnection(connectionDescriptor).isClosed()) {
- connectionDescriptorToConnectionMap.put(connectionDescriptor,
- connectionDescriptor.createConnection(
-
getDriver(connectionDescriptor.getDataStoreDriverClassName())));
- }
- return getConnection(connectionDescriptor);
+ public DataStoreConnection getOpenConnection(ConnectionDescriptor
connectionDescriptor) throws Exception {
+ if (getConnection(connectionDescriptor).isClosed()) {
+ // create a connection and put into cache
+ connectionDescriptorToConnectionMap.put(connectionDescriptor,
+ connectionDescriptor.createConnection(
+
getDriver(connectionDescriptor.getDataStoreDriverClassName())));
+ }
+ return getConnection(connectionDescriptor);
}
public DataStoreDriver getDriver(String driverClassName) {
@@ -132,7 +130,7 @@
* (needed by DataStoreDataSource classes (Oracle, Postgis, ...)
* @return the jdbc Connection
*/
- public Connection getJdbcConnection() {
+ public java.sql.Connection getJdbcConnection() {
throw new UnsupportedOperationException();
}
@@ -221,12 +219,83 @@
listeners.add(listener);
}
- public void closeConnections() throws DataStoreException {
- for (ConnectionDescriptor connectionDescriptor :
getConnectionDescriptors()) {
- if (!getConnection(connectionDescriptor).isClosed()) {
- getConnection(connectionDescriptor).close();
- }
+ /**
+ * run by Exit handler, close all
+ * @throws DataStoreException
+ */
+ public void closeConnections() {
+ for (ConnectionDescriptor connectionDescriptor :
getConnectionDescriptors()) {
+ closeConnection(connectionDescriptor);
+ }
+ }
+
+ /**
+ * close all connections currently not used by any layer in any open task
+ */
+ public void closeConnectionsUnused() {
+ for (ConnectionDescriptor connectionDescriptor :
getConnectionDescriptors()) {
+ if (getLayersUsing(connectionDescriptor).isEmpty()) {
+ closeConnection(connectionDescriptor);
}
+ }
}
+ /**
+ * used by {@link SpatialDSLayer#dispose()}
+ * close the connection utilized by the layer given if no other layer
+ * is currently needing it
+ */
+ public void closeConnection(SpatialDSLayer layer2remove) {
+ ConnectionDescriptor cd2remove = (ConnectionDescriptor)
layer2remove.getDataSourceQuery()
+
.getDataSource().getProperties().get(DataStoreQueryDataSource.CONNECTION_DESCRIPTOR_KEY);
+
+ // find out if same connection is used in another layer
+ List<SpatialDSLayer> layers = getLayersUsing(cd2remove);
+ for (SpatialDSLayer layer : layers) {
+ ConnectionDescriptor layerCd = (ConnectionDescriptor)
layer.getDataSourceQuery()
+
.getDataSource().getProperties().get(DataStoreQueryDataSource.CONNECTION_DESCRIPTOR_KEY);
+ if (layer != layer2remove) {
+ // still needed? nothing to do and return
+ return;
+ }
+ }
+
+ closeConnection(cd2remove);
+ }
+
+ /**
+ * try to close the connection for the given connection descriptor
+ */
+ public void closeConnection(ConnectionDescriptor cd2remove) {
+ try {
+ if (!getConnection(cd2remove).isClosed())
+ getConnection(cd2remove).close();
+ } catch (DataStoreException e) {
+ // ignore but log it
+ Logger.error(e);
+ }
+ }
+
+ /**
+ * gather a list of all spatial db datasource layers using the given
+ * connection descriptor
+ */
+ private List<SpatialDSLayer> getLayersUsing(ConnectionDescriptor cd) {
+ // iterate over al tasks collecting datastore layers
+ List<SpatialDSLayer> layers = new ArrayList();
+ for (TaskFrame frame :
context.getWorkbench().getFrame().getTaskFrames()) {
+
layers.addAll(frame.getLayerManager().getLayerables(SpatialDSLayer.class));
+ }
+
+ // check if anyone is using the connection descriptor given
+ List<SpatialDSLayer> layersUsingThisCD = new ArrayList();
+ for (SpatialDSLayer layer : layers) {
+ ConnectionDescriptor layerCd = (ConnectionDescriptor)
layer.getDataSourceQuery()
+
.getDataSource().getProperties().get(DataStoreQueryDataSource.CONNECTION_DESCRIPTOR_KEY);
+ if (cd == layerCd) {
+ layersUsingThisCD.add(layer);
+ }
+ }
+ return layersUsingThisCD;
+ }
}
\ No newline at end of file
_______________________________________________
Jump-pilot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel