]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.spreadsheet.graph;\r
2 \r
3 import java.io.BufferedInputStream;\r
4 import java.io.File;\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
13 \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
25 \r
26 public class SpreadsheetSessionManager extends StandardSessionManager<SheetNode, SpreadsheetBook> {\r
27 \r
28         private static SpreadsheetSessionManager INSTANCE;\r
29         \r
30         public static SpreadsheetSessionManager getInstance() {\r
31                 if(INSTANCE == null) {\r
32                         INSTANCE = new SpreadsheetSessionManager();\r
33                 }\r
34                 return INSTANCE;\r
35         }\r
36         \r
37         public class ClassLoaderObjectInputStream extends ObjectInputStream{\r
38 \r
39              private ClassLoader classLoader;\r
40 \r
41              public ClassLoaderObjectInputStream(ClassLoader classLoader, InputStream in) throws IOException {\r
42                   super(in);\r
43                   this.classLoader = classLoader;\r
44              }\r
45              \r
46              @Override\r
47              protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException{\r
48              \r
49                   try{\r
50                        String name = desc.getName();\r
51                        return Class.forName(name, false, classLoader);\r
52                   }\r
53                   catch(ClassNotFoundException e){\r
54                        return super.resolveClass(desc);\r
55                   }\r
56              }\r
57         }\r
58         \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
62         \r
63         Resource found = null;\r
64         Set<Resource> founds = new HashSet<>();\r
65         Set<Resource> foundDefaults = new HashSet<>();\r
66 \r
67         for (Resource initialCondition : ics) {\r
68             if (graph.hasStatement(book, SR.Book_HasDefaultInitialCondition, initialCondition)) {\r
69                 foundDefaults.add(initialCondition);\r
70             }\r
71             if (graph.hasStatement(initialCondition, SR.InitialCondition_ConditionOf, book)) {\r
72                 founds.add(initialCondition);\r
73             }\r
74         }\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
79         } else {\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
85                 }\r
86             }\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
91                 }\r
92             }\r
93         }\r
94 \r
95         if (found != null) {\r
96             try {\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
102                 in.close();\r
103                 return srBook;\r
104             } catch (IOException e) {\r
105                 throw new DatabaseException(e);\r
106             } catch (ClassNotFoundException e) {\r
107                 throw new DatabaseException(e);\r
108             }\r
109         }\r
110         return null;\r
111     }\r
112         \r
113     @Override\r
114     protected SpreadsheetBook createEngine(ReadGraph graph, String id) throws DatabaseException {\r
115 \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
124                 if (ic != null)\r
125                     return ic;\r
126             }\r
127 \r
128             SpreadsheetBook ic = getPossibleInitialCondition(graph, bookResource, bookResource);\r
129             if (ic != null)\r
130                 return ic;\r
131         }\r
132 \r
133         SpreadsheetBook book = new SpreadsheetBook();\r
134         \r
135         Variable base = ProxyVariables.proxyVariableBase(graph, run);\r
136         Resource bookResource = base.getRepresents(graph);\r
137         Variable configuration = Variables.getVariable(graph, bookResource);\r
138         \r
139         SpreadsheetSynchronizationEventHandler handler = new SpreadsheetSynchronizationEventHandler(graph, book);\r
140         Synchronizer synchronizer = new Synchronizer(graph);\r
141         synchronizer.fullSynchronization(configuration, handler);\r
142         \r
143         return book;\r
144 \r
145     }\r
146 \r
147         @Override\r
148         protected StandardRealm<SheetNode, SpreadsheetBook> createRealm(SpreadsheetBook engine, String id) {\r
149                 return new SpreadsheetRealm(engine, id);\r
150         }\r
151         \r
152 //    static ConcurrentHashMap<String, SpreadsheetRealm> REALMS =\r
153 //            new ConcurrentHashMap<String, SpreadsheetRealm>(); \r
154 //    \r
155 //    static ConcurrentHashMap<String, NodeSupport<String>> SUPPORTS =\r
156 //            new ConcurrentHashMap<String, NodeSupport<String>>(); \r
157 //    \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
161 //    }\r
162 //    \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
170 //              }\r
171 //              return result;\r
172 //        }\r
173 //    }\r
174 //    \r
175 //    public static SpreadsheetRealm createRealm() {\r
176 //        synchronized(REALMS) {\r
177 //            String id = UUID.randomUUID().toString();\r
178 //            return createRealm(id);\r
179 //        }\r
180 //    }\r
181 //    \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
187 //            else\r
188 //                return session;\r
189 //        }\r
190 //    }\r
191 //    \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
196 //        return realm;\r
197 //    }\r
198 //    \r
199 //    public static void removeRealm(String id) {\r
200 //              REALMS.remove(id);\r
201 //    }\r
202         \r
203 }\r