]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetSessionManager.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / SpreadsheetSessionManager.java
diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetSessionManager.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetSessionManager.java
new file mode 100644 (file)
index 0000000..ff247b7
--- /dev/null
@@ -0,0 +1,203 @@
+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