--- /dev/null
+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