-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.variable.ProxyVariables;
+import org.simantics.db.layer0.variable.Variable;
+import org.simantics.db.layer0.variable.Variables;
+import org.simantics.simulator.toolkit.StandardRealm;
+import org.simantics.simulator.toolkit.db.StandardSessionManager;
+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);
+ }
+}
+