]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetSessionManager.java
Some fixes for resource cleaning spreadsheets in simupedia
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / SpreadsheetSessionManager.java
index ff247b73a76f30b51d78d79aa6760a0a706d7e54..d90fe3106613fbad5907920a5711f00492c4bc51 100644 (file)
-package org.simantics.spreadsheet.graph;\r
-\r
-import java.io.BufferedInputStream;\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.io.ObjectInputStream;\r
-import java.io.ObjectStreamClass;\r
-import java.util.Collection;\r
-import java.util.HashSet;\r
-import java.util.Set;\r
-\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.StandardRealm;\r
-import org.simantics.db.layer0.StandardSessionManager;\r
-import org.simantics.db.layer0.variable.ProxyVariables;\r
-import org.simantics.db.layer0.variable.Variable;\r
-import org.simantics.db.layer0.variable.Variables;\r
-import org.simantics.spreadsheet.graph.synchronization.SpreadsheetSynchronizationEventHandler;\r
-import org.simantics.spreadsheet.resource.SpreadsheetResource;\r
-import org.simantics.structural.synchronization.Synchronizer;\r
-\r
-public class SpreadsheetSessionManager extends StandardSessionManager<SheetNode, SpreadsheetBook> {\r
-\r
-       private static SpreadsheetSessionManager INSTANCE;\r
-       \r
-       public static SpreadsheetSessionManager getInstance() {\r
-               if(INSTANCE == null) {\r
-                       INSTANCE = new SpreadsheetSessionManager();\r
-               }\r
-               return INSTANCE;\r
-       }\r
-       \r
-       public class ClassLoaderObjectInputStream extends ObjectInputStream{\r
-\r
-            private ClassLoader classLoader;\r
-\r
-            public ClassLoaderObjectInputStream(ClassLoader classLoader, InputStream in) throws IOException {\r
-                 super(in);\r
-                 this.classLoader = classLoader;\r
-            }\r
-            \r
-            @Override\r
-            protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException{\r
-            \r
-                 try{\r
-                      String name = desc.getName();\r
-                      return Class.forName(name, false, classLoader);\r
-                 }\r
-                 catch(ClassNotFoundException e){\r
-                      return super.resolveClass(desc);\r
-                 }\r
-            }\r
-       }\r
-       \r
-    private SpreadsheetBook getPossibleInitialCondition(ReadGraph graph, Resource context, Resource book) throws DatabaseException {\r
-        SpreadsheetResource SR = SpreadsheetResource.getInstance(graph);\r
-        Collection<Resource> ics = graph.getObjects(context, SR.HasInitialCondition);\r
-        \r
-        Resource found = null;\r
-        Set<Resource> founds = new HashSet<>();\r
-        Set<Resource> foundDefaults = new HashSet<>();\r
-\r
-        for (Resource initialCondition : ics) {\r
-            if (graph.hasStatement(book, SR.Book_HasDefaultInitialCondition, initialCondition)) {\r
-                foundDefaults.add(initialCondition);\r
-            }\r
-            if (graph.hasStatement(initialCondition, SR.InitialCondition_ConditionOf, book)) {\r
-                founds.add(initialCondition);\r
-            }\r
-        }\r
-        if (foundDefaults.size() == 1) {\r
-            found = foundDefaults.iterator().next();\r
-        } else if (foundDefaults.size() == 0 && founds.size() == 1) {\r
-            found = founds.iterator().next();\r
-        } else {\r
-            System.err.println("Could not find IC for SpreadsheetBook " + graph.getPossibleURI(book));\r
-            System.err.println("foundDefaults : " + foundDefaults.size());\r
-            if (!foundDefaults.isEmpty()) {\r
-                for (Resource foundDefault : foundDefaults) {\r
-                    System.err.println(graph.getPossibleURI(foundDefault));\r
-                }\r
-            }\r
-            System.err.println("founds : " + founds.size());\r
-            if (!founds.isEmpty()) {\r
-                for (Resource foun : founds) {\r
-                    System.err.println(graph.getPossibleURI(foun));\r
-                }\r
-            }\r
-        }\r
-\r
-        if (found != null) {\r
-            try {\r
-                File tmp = SpreadsheetGraphUtils.extractInitialCondition(graph, found);\r
-                System.err.println("Extracting IC from " + tmp.getAbsolutePath());\r
-                InputStream fileIn = new BufferedInputStream(new FileInputStream(tmp));\r
-                ObjectInputStream in = new ClassLoaderObjectInputStream(getClass().getClassLoader(), fileIn);\r
-                SpreadsheetBook srBook = (SpreadsheetBook) in.readObject();\r
-                in.close();\r
-                return srBook;\r
-            } catch (IOException e) {\r
-                throw new DatabaseException(e);\r
-            } catch (ClassNotFoundException e) {\r
-                throw new DatabaseException(e);\r
-            }\r
-        }\r
-        return null;\r
-    }\r
-       \r
-    @Override\r
-    protected SpreadsheetBook createEngine(ReadGraph graph, String id) throws DatabaseException {\r
-\r
-        Variable run = Variables.getVariable(graph, id);\r
-        Variable context = ProxyVariables.proxyVariableInput(graph, run);\r
-        if (context != null) {\r
-            Variable base = ProxyVariables.proxyVariableBase(graph, run);\r
-            Resource bookResource = base.getRepresents(graph);\r
-            Resource contextResource = context.getRepresents(graph);\r
-            if (contextResource != null) {\r
-                SpreadsheetBook ic = getPossibleInitialCondition(graph, contextResource, bookResource);\r
-                if (ic != null)\r
-                    return ic;\r
-            }\r
-\r
-            SpreadsheetBook ic = getPossibleInitialCondition(graph, bookResource, bookResource);\r
-            if (ic != null)\r
-                return ic;\r
-        }\r
-\r
-        SpreadsheetBook book = new SpreadsheetBook();\r
-        \r
-        Variable base = ProxyVariables.proxyVariableBase(graph, run);\r
-        Resource bookResource = base.getRepresents(graph);\r
-       Variable configuration = Variables.getVariable(graph, bookResource);\r
-        \r
-        SpreadsheetSynchronizationEventHandler handler = new SpreadsheetSynchronizationEventHandler(graph, book);\r
-        Synchronizer synchronizer = new Synchronizer(graph);\r
-        synchronizer.fullSynchronization(configuration, handler);\r
-        \r
-        return book;\r
-\r
-    }\r
-\r
-       @Override\r
-       protected StandardRealm<SheetNode, SpreadsheetBook> createRealm(SpreadsheetBook engine, String id) {\r
-               return new SpreadsheetRealm(engine, id);\r
-       }\r
-       \r
-//    static ConcurrentHashMap<String, SpreadsheetRealm> REALMS =\r
-//            new ConcurrentHashMap<String, SpreadsheetRealm>(); \r
-//    \r
-//    static ConcurrentHashMap<String, NodeSupport<String>> SUPPORTS =\r
-//            new ConcurrentHashMap<String, NodeSupport<String>>(); \r
-//    \r
-//    public static SpreadsheetRealm sclRealmById(String id) {\r
-//        // CONNECTIONS is ConcurrentHashMap so no synchronization is needed here\r
-//        return REALMS.get(id);\r
-//    }\r
-//    \r
-//    public static NodeSupport<String> getOrCreateNodeSupport(String id) {\r
-//        synchronized(SUPPORTS) {\r
-//             NodeSupport<String> result = SUPPORTS.get(id);\r
-//             if(result == null) {\r
-//                     SpreadsheetRealm realm = getOrCreateSCLRealm(id);\r
-//                     result = new NodeSupport<String>(realm.getNodeManager());\r
-//                     SUPPORTS.put(id, result);\r
-//             }\r
-//             return result;\r
-//        }\r
-//    }\r
-//    \r
-//    public static SpreadsheetRealm createRealm() {\r
-//        synchronized(REALMS) {\r
-//            String id = UUID.randomUUID().toString();\r
-//            return createRealm(id);\r
-//        }\r
-//    }\r
-//    \r
-//    public static SpreadsheetRealm getOrCreateSCLRealm(String id) {\r
-//        synchronized(REALMS) {\r
-//             SpreadsheetRealm session = sclRealmById(id);\r
-//            if(session == null)\r
-//                return createRealm(id);\r
-//            else\r
-//                return session;\r
-//        }\r
-//    }\r
-//    \r
-//    private static SpreadsheetRealm createRealm(String id) {\r
-//        SpreadsheetBook book = new SpreadsheetBook();\r
-//        SpreadsheetRealm realm = new SpreadsheetRealm(book, id);\r
-//        REALMS.put(id, realm);\r
-//        return realm;\r
-//    }\r
-//    \r
-//    public static void removeRealm(String id) {\r
-//             REALMS.remove(id);\r
-//    }\r
-       \r
-}\r
+package org.simantics.spreadsheet.graph;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamClass;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.StandardRealm;
+import org.simantics.db.layer0.StandardSessionManager;
+import org.simantics.db.layer0.variable.ProxyVariables;
+import org.simantics.db.layer0.variable.Variable;
+import org.simantics.db.layer0.variable.Variables;
+import org.simantics.spreadsheet.graph.formula.SpreadsheetEvaluationEnvironment;
+import org.simantics.spreadsheet.graph.synchronization.SpreadsheetSynchronizationEventHandler;
+import org.simantics.spreadsheet.resource.SpreadsheetResource;
+import org.simantics.structural.synchronization.Synchronizer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SpreadsheetSessionManager extends StandardSessionManager<SheetNode, SpreadsheetBook> {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SpreadsheetSessionManager.class);
+    
+       private static SpreadsheetSessionManager INSTANCE;
+       
+       public static SpreadsheetSessionManager getInstance() {
+               if(INSTANCE == null) {
+                       INSTANCE = new SpreadsheetSessionManager();
+               }
+               return INSTANCE;
+       }
+       
+       public class ClassLoaderObjectInputStream extends ObjectInputStream{
+
+            private ClassLoader classLoader;
+
+            public ClassLoaderObjectInputStream(ClassLoader classLoader, InputStream in) throws IOException {
+                 super(in);
+                 this.classLoader = classLoader;
+            }
+            
+            @Override
+            protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException{
+            
+                 try{
+                      String name = desc.getName();
+                      return Class.forName(name, false, classLoader);
+                 }
+                 catch(ClassNotFoundException e){
+                      return super.resolveClass(desc);
+                 }
+            }
+       }
+       
+    private SpreadsheetBook getPossibleInitialCondition(ReadGraph graph, Resource context, Resource book) throws DatabaseException {
+        SpreadsheetResource SR = SpreadsheetResource.getInstance(graph);
+        Collection<Resource> ics = graph.getObjects(context, SR.HasInitialCondition);
+        
+        Resource found = null;
+        Set<Resource> founds = new HashSet<>();
+        Set<Resource> foundDefaults = new HashSet<>();
+
+        for (Resource initialCondition : ics) {
+            if (graph.hasStatement(book, SR.Book_HasDefaultInitialCondition, initialCondition)) {
+                foundDefaults.add(initialCondition);
+            }
+            if (graph.hasStatement(initialCondition, SR.InitialCondition_ConditionOf, book)) {
+                founds.add(initialCondition);
+            }
+        }
+        if (foundDefaults.size() == 1) {
+            found = foundDefaults.iterator().next();
+        } else if (foundDefaults.size() == 0 && founds.size() == 1) {
+            found = founds.iterator().next();
+        } else {
+            System.err.println("Could not find IC for SpreadsheetBook " + graph.getPossibleURI(book));
+            System.err.println("foundDefaults : " + foundDefaults.size());
+            if (!foundDefaults.isEmpty()) {
+                for (Resource foundDefault : foundDefaults) {
+                    System.err.println(graph.getPossibleURI(foundDefault));
+                }
+            }
+            System.err.println("founds : " + founds.size());
+            if (!founds.isEmpty()) {
+                for (Resource foun : founds) {
+                    System.err.println(graph.getPossibleURI(foun));
+                }
+            }
+        }
+
+        if (found != null) {
+            try {
+                File tmp = SpreadsheetGraphUtils.extractInitialCondition(graph, found);
+                System.err.println("Extracting IC from " + tmp.getAbsolutePath());
+                InputStream fileIn = new BufferedInputStream(new FileInputStream(tmp));
+                ObjectInputStream in = new ClassLoaderObjectInputStream(getClass().getClassLoader(), fileIn);
+                SpreadsheetBook srBook = (SpreadsheetBook) in.readObject();
+                in.close();
+                return srBook;
+            } catch (IOException e) {
+                throw new DatabaseException(e);
+            } catch (ClassNotFoundException e) {
+                throw new DatabaseException(e);
+            }
+        }
+        return null;
+    }
+       
+    @Override
+    protected SpreadsheetBook createEngine(ReadGraph graph, String id) throws DatabaseException {
+
+        Variable run = Variables.getVariable(graph, id);
+        Variable context = ProxyVariables.proxyVariableInput(graph, run);
+        if (context != null) {
+            Variable base = ProxyVariables.proxyVariableBase(graph, run);
+            Resource bookResource = base.getRepresents(graph);
+            Resource contextResource = context.getRepresents(graph);
+            if (contextResource != null) {
+                SpreadsheetBook ic = getPossibleInitialCondition(graph, contextResource, bookResource);
+                if (ic != null)
+                    return ic;
+            }
+
+            SpreadsheetBook ic = getPossibleInitialCondition(graph, bookResource, bookResource);
+            if (ic != null)
+                return ic;
+        }
+
+        SpreadsheetBook book = new SpreadsheetBook();
+        
+        Variable base = ProxyVariables.proxyVariableBase(graph, run);
+        Resource bookResource = base.getRepresents(graph);
+       Variable configuration = Variables.getVariable(graph, bookResource);
+        
+        SpreadsheetSynchronizationEventHandler handler = new SpreadsheetSynchronizationEventHandler(graph, book);
+        Synchronizer synchronizer = new Synchronizer(graph);
+        synchronizer.fullSynchronization(configuration, handler);
+        
+        return book;
+
+    }
+
+       @Override
+       protected StandardRealm<SheetNode, SpreadsheetBook> createRealm(SpreadsheetBook engine, String id) {
+               return new SpreadsheetRealm(engine, id);
+       }
+
+       @Override
+       public void removeRealm(WriteGraph graph, String id) throws DatabaseException {
+        StandardRealm<SheetNode, SpreadsheetBook> realm = getOrCreateRealm(graph, id);
+        SpreadsheetEvaluationEnvironment.removeInstance(realm.getEngine());
+        super.removeRealm(graph, id);
+    }
+    
+    // Utility function for SCL, this should maybe be replaced with something better in the future
+    public static void removeSpreadsheetSession(WriteGraph graph, Variable runVariable) throws DatabaseException {
+        String uri = runVariable.getParent(graph).getURI(graph);
+        getInstance().removeRealm(graph, uri);
+    }
+}
+