]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardSessionManager.java
Some fixes for resource cleaning spreadsheets in simupedia
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / StandardSessionManager.java
index 0f9a919a3f2d881392c8b5313d7a90878dfc0555..cdd8e074c404ee4d698878b37eaf7d7478c36eca 100644 (file)
-package org.simantics.db.layer0;\r
-\r
-import java.util.Collection;\r
-import java.util.concurrent.ConcurrentHashMap;\r
-\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.common.request.ParametrizedPrimitiveRead;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.variable.NodeSupport;\r
-import org.simantics.db.procedure.Listener;\r
-\r
-abstract public class StandardSessionManager<Node, Engine extends StandardEngine<Node>> {\r
-\r
-    private ConcurrentHashMap<String, Listener<StandardRealm<Node,Engine>>> realmListeners = new ConcurrentHashMap<>();\r
-    private ConcurrentHashMap<String, StandardRealm<Node,Engine>> REALMS = new ConcurrentHashMap<String, StandardRealm<Node,Engine>>(); \r
-    private ConcurrentHashMap<String, NodeSupport<Node>> SUPPORTS = new ConcurrentHashMap<String, NodeSupport<Node>>(); \r
-\r
-    // Accessing Realms should be done over ParametrizedPrimitveRead for the\r
-    // case if a realm is destroyed and new one is created with the same id than\r
-    // the previously deleted one for the listeners to get discarded and new\r
-    // registered\r
-    private class RealmRequest extends ParametrizedPrimitiveRead<String, StandardRealm<Node, Engine>> {\r
-\r
-        public RealmRequest(String parameter) {\r
-            super(parameter);\r
-        }\r
-\r
-        @Override\r
-        public void register(ReadGraph graph, Listener<StandardRealm<Node, Engine>> procedure) {\r
-\r
-            StandardRealm<Node, Engine> realm = REALMS.get(parameter);\r
-            if (realm == null) {\r
-                try {\r
-                    realm = createRealmInner(graph, parameter);\r
-                } catch (DatabaseException e) {\r
-                    e.printStackTrace();\r
-                }\r
-            }\r
-            \r
-            if(procedure.isDisposed()) {\r
-                procedure.execute(realm);\r
-                return;\r
-            }\r
-            \r
-            Listener<StandardRealm<Node,Engine>> existing = getOrDisposeListener(parameter);\r
-            assert(existing == null);\r
-            realmListeners.put(parameter, procedure);\r
-            procedure.execute(realm);\r
-        }\r
-\r
-        private StandardRealm<Node,Engine> createRealmInner(ReadGraph graph, String id) throws DatabaseException {\r
-            Engine engine = createEngine(graph, id);\r
-            StandardRealm<Node,Engine> realm = createRealm(engine, id);\r
-            modifyRealms(id, realm);\r
-            return realm;\r
-        }\r
-    }\r
-    \r
-    protected StandardSessionManager() {\r
-    }\r
-    \r
-    private Listener<StandardRealm<Node,Engine>> getOrDisposeListener(String key) {\r
-        Listener<StandardRealm<Node,Engine>> listener = realmListeners.get(key);\r
-        if(listener != null) {\r
-            if(listener.isDisposed()) {\r
-                realmListeners.remove(key);\r
-            } else {\r
-                return listener;\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-    \r
-    private void modifyRealms(String key, StandardRealm<Node,Engine> realm) {\r
-        if(realm != null) {\r
-            REALMS.put(key, realm);\r
-        } else {\r
-            REALMS.remove(key);\r
-        }\r
-        Listener<StandardRealm<Node,Engine>> listener = getOrDisposeListener(key);\r
-        if(listener != null) {\r
-            listener.execute(realm);\r
-        }\r
-    }\r
-\r
-    public NodeSupport<Node> getOrCreateNodeSupport(ReadGraph graph, String id) throws DatabaseException {\r
-        synchronized(SUPPORTS) {\r
-               NodeSupport<Node> result = SUPPORTS.get(id);\r
-               if(result == null) {\r
-                       StandardRealm<Node,Engine> realm = getOrCreateRealm(graph, id);\r
-                       result = new NodeSupport<Node>(realm.getNodeManager());\r
-                       SUPPORTS.put(id, result);\r
-               }\r
-               return result;\r
-        }\r
-    }\r
-    \r
-    public StandardRealm<Node,Engine> getOrCreateRealm(ReadGraph graph, String id) throws DatabaseException {\r
-        synchronized(REALMS) {\r
-            return graph.syncRequest(new RealmRequest(id));\r
-        }\r
-    }\r
-    \r
-    protected abstract Engine createEngine(ReadGraph graph, String id) throws DatabaseException;\r
-    protected abstract StandardRealm<Node,Engine> createRealm(Engine engine, String id);\r
-    \r
-    public void removeRealm(String id) {\r
-        modifyRealms(id, null);\r
-        // if node support has been created remove it as well\r
-        SUPPORTS.remove(id);\r
-    }\r
-    \r
-    public Collection<String> getRealms() {\r
-        return REALMS.keySet();\r
-    }\r
-}\r
+package org.simantics.db.layer0;
+
+import java.util.Collection;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.request.ParametrizedPrimitiveRead;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.variable.NodeSupport;
+import org.simantics.db.procedure.Listener;
+
+abstract public class StandardSessionManager<Node, Engine extends StandardEngine<Node>> {
+
+    private ConcurrentHashMap<String, Listener<StandardRealm<Node,Engine>>> realmListeners = new ConcurrentHashMap<>();
+    private ConcurrentHashMap<String, StandardRealm<Node,Engine>> REALMS = new ConcurrentHashMap<String, StandardRealm<Node,Engine>>(); 
+    private ConcurrentHashMap<String, NodeSupport<Node>> SUPPORTS = new ConcurrentHashMap<String, NodeSupport<Node>>(); 
+
+    // Accessing Realms should be done over ParametrizedPrimitveRead for the
+    // case if a realm is destroyed and new one is created with the same id than
+    // the previously deleted one for the listeners to get discarded and new
+    // registered
+    private class RealmRequest extends ParametrizedPrimitiveRead<String, StandardRealm<Node, Engine>> {
+
+        public RealmRequest(String parameter) {
+            super(parameter);
+        }
+
+        @Override
+        public void register(ReadGraph graph, Listener<StandardRealm<Node, Engine>> procedure) {
+
+            StandardRealm<Node, Engine> realm = REALMS.get(parameter);
+            if (realm == null) {
+                try {
+                    realm = createRealmInner(graph, parameter);
+                } catch (DatabaseException e) {
+                    e.printStackTrace();
+                }
+            }
+            
+            if(procedure.isDisposed()) {
+                procedure.execute(realm);
+                return;
+            }
+            
+            Listener<StandardRealm<Node,Engine>> existing = getOrDisposeListener(parameter);
+            assert(existing == null);
+            realmListeners.put(parameter, procedure);
+            procedure.execute(realm);
+        }
+
+        private StandardRealm<Node,Engine> createRealmInner(ReadGraph graph, String id) throws DatabaseException {
+            Engine engine = createEngine(graph, id);
+            StandardRealm<Node,Engine> realm = createRealm(engine, id);
+            modifyRealms(id, realm);
+            return realm;
+        }
+    }
+    
+    protected StandardSessionManager() {
+    }
+    
+    private Listener<StandardRealm<Node,Engine>> getOrDisposeListener(String key) {
+        Listener<StandardRealm<Node,Engine>> listener = realmListeners.get(key);
+        if(listener != null) {
+            if(listener.isDisposed()) {
+                realmListeners.remove(key);
+            } else {
+                return listener;
+            }
+        }
+        return null;
+    }
+    
+    private void modifyRealms(String key, StandardRealm<Node,Engine> realm) {
+        if(realm != null) {
+            REALMS.put(key, realm);
+        } else {
+            StandardRealm<Node, Engine> removedRealm = REALMS.remove(key);
+            if (removedRealm != null)
+                removedRealm.close();
+        }
+        Listener<StandardRealm<Node,Engine>> listener = getOrDisposeListener(key);
+        if(listener != null) {
+            listener.execute(realm);
+        }
+    }
+
+    public NodeSupport<Node> getOrCreateNodeSupport(ReadGraph graph, String id) throws DatabaseException {
+        synchronized(SUPPORTS) {
+               NodeSupport<Node> result = SUPPORTS.get(id);
+               if(result == null) {
+                       StandardRealm<Node,Engine> realm = getOrCreateRealm(graph, id);
+                       result = new NodeSupport<Node>(realm.getNodeManager());
+                       SUPPORTS.put(id, result);
+               }
+               return result;
+        }
+    }
+    
+    public StandardRealm<Node,Engine> getOrCreateRealm(ReadGraph graph, String id) throws DatabaseException {
+        synchronized(REALMS) {
+            return graph.syncRequest(new RealmRequest(id));
+        }
+    }
+    
+    protected abstract Engine createEngine(ReadGraph graph, String id) throws DatabaseException;
+    protected abstract StandardRealm<Node,Engine> createRealm(Engine engine, String id);
+    
+    public void removeRealm(WriteGraph graph, String id) throws DatabaseException {
+        modifyRealms(id, null);
+        // remove listeners from this realm
+        realmListeners.remove(id);
+        // if node support has been created remove it as well
+        NodeSupport<Node> support = SUPPORTS.remove(id);
+        if (support != null)
+            support.dispose();
+    }
+    
+    public Collection<String> getRealms() {
+        return REALMS.keySet();
+    }
+}