]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/InitSupportImpl.java
Merge commit 'bf75fd9'
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / InitSupportImpl.java
1 package fi.vtt.simantics.procore.internal;\r
2 \r
3 import java.util.HashSet;\r
4 import java.util.Vector;\r
5 \r
6 import org.simantics.db.WriteGraph;\r
7 import org.simantics.db.common.request.WriteRequest;\r
8 import org.simantics.db.exception.DatabaseException;\r
9 import org.simantics.db.exception.InternalException;\r
10 import org.simantics.db.exception.RuntimeDatabaseException;\r
11 import org.simantics.db.exception.TimeoutException;\r
12 import org.simantics.db.impl.ClusterBase;\r
13 import org.simantics.db.impl.ClusterSupport;\r
14 import org.simantics.db.service.ClusterUID;\r
15 import org.simantics.db.service.InitSupport;\r
16 import org.simantics.db.service.LifecycleSupport;\r
17 \r
18 public class InitSupportImpl implements InitSupport {\r
19     final private SessionImplSocket session;\r
20 \r
21     InitSupportImpl(SessionImplSocket session) {\r
22         this.session = session;\r
23     }\r
24 \r
25     @Override\r
26     public void close() throws DatabaseException, TimeoutException {\r
27         session.getService(LifecycleSupport.class).close();\r
28     }\r
29 \r
30     @Override\r
31     public void addBuiltins(final HashSet<Builtin> builtins)\r
32     throws InternalException {\r
33         try {\r
34             session.syncRequest(new WriteRequest() {\r
35                 @Override\r
36                 public void perform(WriteGraph graph) throws DatabaseException {\r
37                     ClusterSupport cs = session.getService(ClusterSupport.class);\r
38                     Vector<Builtin> v = new Vector<Builtin>();\r
39                     final int N = builtins.size();\r
40                     v.setSize(N + 1); // Index starts with one, zero left as sentinel.\r
41                     for (Builtin b : builtins) {\r
42                         if (b.index < 1 || b.index > N)\r
43                             throw new RuntimeDatabaseException("Illeagal resource index for builtin."\r
44                             + " index=" + b.index + " uri=" + b.uri + " N=" + N);\r
45                         v.set(b.index, b);\r
46                     }\r
47                     for (int i=1; i<N+1; ++i) {\r
48                         if (v.get(i) == null)\r
49                             throw new RuntimeDatabaseException("Missing builtin for resource index=" + i);\r
50                     }\r
51                     ClusterBase cluster = cs.getClusterByClusterUIDOrMake(ClusterUID.Builtin);\r
52                     long clusterId = cluster.getClusterId();\r
53                     for (int i=1; i<N+1; ++i) {\r
54                         Builtin b = v.get(i);\r
55                         cs.createResource(cluster, (short)b.index, clusterId);\r
56                     }\r
57                     cluster.setImmutable(true, cs);\r
58                 }\r
59             });\r
60         } catch (DatabaseException e) {\r
61             throw new InternalException("Failed to init graph.", e);\r
62         }\r
63     }\r
64 }\r