1 package org.simantics.spreadsheet.graph;
\r
3 import java.io.BufferedInputStream;
\r
5 import java.io.FileInputStream;
\r
6 import java.io.IOException;
\r
7 import java.io.InputStream;
\r
8 import java.io.ObjectInputStream;
\r
9 import java.io.ObjectStreamClass;
\r
10 import java.util.Collection;
\r
11 import java.util.HashSet;
\r
12 import java.util.Set;
\r
14 import org.simantics.db.ReadGraph;
\r
15 import org.simantics.db.Resource;
\r
16 import org.simantics.db.exception.DatabaseException;
\r
17 import org.simantics.db.layer0.StandardRealm;
\r
18 import org.simantics.db.layer0.StandardSessionManager;
\r
19 import org.simantics.db.layer0.variable.ProxyVariables;
\r
20 import org.simantics.db.layer0.variable.Variable;
\r
21 import org.simantics.db.layer0.variable.Variables;
\r
22 import org.simantics.spreadsheet.graph.synchronization.SpreadsheetSynchronizationEventHandler;
\r
23 import org.simantics.spreadsheet.resource.SpreadsheetResource;
\r
24 import org.simantics.structural.synchronization.Synchronizer;
\r
26 public class SpreadsheetSessionManager extends StandardSessionManager<SheetNode, SpreadsheetBook> {
\r
28 private static SpreadsheetSessionManager INSTANCE;
\r
30 public static SpreadsheetSessionManager getInstance() {
\r
31 if(INSTANCE == null) {
\r
32 INSTANCE = new SpreadsheetSessionManager();
\r
37 public class ClassLoaderObjectInputStream extends ObjectInputStream{
\r
39 private ClassLoader classLoader;
\r
41 public ClassLoaderObjectInputStream(ClassLoader classLoader, InputStream in) throws IOException {
\r
43 this.classLoader = classLoader;
\r
47 protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException{
\r
50 String name = desc.getName();
\r
51 return Class.forName(name, false, classLoader);
\r
53 catch(ClassNotFoundException e){
\r
54 return super.resolveClass(desc);
\r
59 private SpreadsheetBook getPossibleInitialCondition(ReadGraph graph, Resource context, Resource book) throws DatabaseException {
\r
60 SpreadsheetResource SR = SpreadsheetResource.getInstance(graph);
\r
61 Collection<Resource> ics = graph.getObjects(context, SR.HasInitialCondition);
\r
63 Resource found = null;
\r
64 Set<Resource> founds = new HashSet<>();
\r
65 Set<Resource> foundDefaults = new HashSet<>();
\r
67 for (Resource initialCondition : ics) {
\r
68 if (graph.hasStatement(book, SR.Book_HasDefaultInitialCondition, initialCondition)) {
\r
69 foundDefaults.add(initialCondition);
\r
71 if (graph.hasStatement(initialCondition, SR.InitialCondition_ConditionOf, book)) {
\r
72 founds.add(initialCondition);
\r
75 if (foundDefaults.size() == 1) {
\r
76 found = foundDefaults.iterator().next();
\r
77 } else if (foundDefaults.size() == 0 && founds.size() == 1) {
\r
78 found = founds.iterator().next();
\r
80 System.err.println("Could not find IC for SpreadsheetBook " + graph.getPossibleURI(book));
\r
81 System.err.println("foundDefaults : " + foundDefaults.size());
\r
82 if (!foundDefaults.isEmpty()) {
\r
83 for (Resource foundDefault : foundDefaults) {
\r
84 System.err.println(graph.getPossibleURI(foundDefault));
\r
87 System.err.println("founds : " + founds.size());
\r
88 if (!founds.isEmpty()) {
\r
89 for (Resource foun : founds) {
\r
90 System.err.println(graph.getPossibleURI(foun));
\r
95 if (found != null) {
\r
97 File tmp = SpreadsheetGraphUtils.extractInitialCondition(graph, found);
\r
98 System.err.println("Extracting IC from " + tmp.getAbsolutePath());
\r
99 InputStream fileIn = new BufferedInputStream(new FileInputStream(tmp));
\r
100 ObjectInputStream in = new ClassLoaderObjectInputStream(getClass().getClassLoader(), fileIn);
\r
101 SpreadsheetBook srBook = (SpreadsheetBook) in.readObject();
\r
104 } catch (IOException e) {
\r
105 throw new DatabaseException(e);
\r
106 } catch (ClassNotFoundException e) {
\r
107 throw new DatabaseException(e);
\r
114 protected SpreadsheetBook createEngine(ReadGraph graph, String id) throws DatabaseException {
\r
116 Variable run = Variables.getVariable(graph, id);
\r
117 Variable context = ProxyVariables.proxyVariableInput(graph, run);
\r
118 if (context != null) {
\r
119 Variable base = ProxyVariables.proxyVariableBase(graph, run);
\r
120 Resource bookResource = base.getRepresents(graph);
\r
121 Resource contextResource = context.getRepresents(graph);
\r
122 if (contextResource != null) {
\r
123 SpreadsheetBook ic = getPossibleInitialCondition(graph, contextResource, bookResource);
\r
128 SpreadsheetBook ic = getPossibleInitialCondition(graph, bookResource, bookResource);
\r
133 SpreadsheetBook book = new SpreadsheetBook();
\r
135 Variable base = ProxyVariables.proxyVariableBase(graph, run);
\r
136 Resource bookResource = base.getRepresents(graph);
\r
137 Variable configuration = Variables.getVariable(graph, bookResource);
\r
139 SpreadsheetSynchronizationEventHandler handler = new SpreadsheetSynchronizationEventHandler(graph, book);
\r
140 Synchronizer synchronizer = new Synchronizer(graph);
\r
141 synchronizer.fullSynchronization(configuration, handler);
\r
148 protected StandardRealm<SheetNode, SpreadsheetBook> createRealm(SpreadsheetBook engine, String id) {
\r
149 return new SpreadsheetRealm(engine, id);
\r
152 // static ConcurrentHashMap<String, SpreadsheetRealm> REALMS =
\r
153 // new ConcurrentHashMap<String, SpreadsheetRealm>();
\r
155 // static ConcurrentHashMap<String, NodeSupport<String>> SUPPORTS =
\r
156 // new ConcurrentHashMap<String, NodeSupport<String>>();
\r
158 // public static SpreadsheetRealm sclRealmById(String id) {
\r
159 // // CONNECTIONS is ConcurrentHashMap so no synchronization is needed here
\r
160 // return REALMS.get(id);
\r
163 // public static NodeSupport<String> getOrCreateNodeSupport(String id) {
\r
164 // synchronized(SUPPORTS) {
\r
165 // NodeSupport<String> result = SUPPORTS.get(id);
\r
166 // if(result == null) {
\r
167 // SpreadsheetRealm realm = getOrCreateSCLRealm(id);
\r
168 // result = new NodeSupport<String>(realm.getNodeManager());
\r
169 // SUPPORTS.put(id, result);
\r
175 // public static SpreadsheetRealm createRealm() {
\r
176 // synchronized(REALMS) {
\r
177 // String id = UUID.randomUUID().toString();
\r
178 // return createRealm(id);
\r
182 // public static SpreadsheetRealm getOrCreateSCLRealm(String id) {
\r
183 // synchronized(REALMS) {
\r
184 // SpreadsheetRealm session = sclRealmById(id);
\r
185 // if(session == null)
\r
186 // return createRealm(id);
\r
192 // private static SpreadsheetRealm createRealm(String id) {
\r
193 // SpreadsheetBook book = new SpreadsheetBook();
\r
194 // SpreadsheetRealm realm = new SpreadsheetRealm(book, id);
\r
195 // REALMS.put(id, realm);
\r
199 // public static void removeRealm(String id) {
\r
200 // REALMS.remove(id);
\r