--- /dev/null
+package fi.vtt.simantics.procore.internal;\r
+\r
+import java.util.HashSet;\r
+import java.util.Vector;\r
+\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.exception.InternalException;\r
+import org.simantics.db.exception.RuntimeDatabaseException;\r
+import org.simantics.db.exception.TimeoutException;\r
+import org.simantics.db.impl.ClusterBase;\r
+import org.simantics.db.impl.ClusterSupport;\r
+import org.simantics.db.service.ClusterUID;\r
+import org.simantics.db.service.InitSupport;\r
+import org.simantics.db.service.LifecycleSupport;\r
+\r
+public class InitSupportImpl implements InitSupport {\r
+ final private SessionImplSocket session;\r
+\r
+ InitSupportImpl(SessionImplSocket session) {\r
+ this.session = session;\r
+ }\r
+\r
+ @Override\r
+ public void close() throws DatabaseException, TimeoutException {\r
+ session.getService(LifecycleSupport.class).close();\r
+ }\r
+\r
+ @Override\r
+ public void addBuiltins(final HashSet<Builtin> builtins)\r
+ throws InternalException {\r
+ try {\r
+ session.syncRequest(new WriteRequest() {\r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+ ClusterSupport cs = session.getService(ClusterSupport.class);\r
+ Vector<Builtin> v = new Vector<Builtin>();\r
+ final int N = builtins.size();\r
+ v.setSize(N + 1); // Index starts with one, zero left as sentinel.\r
+ for (Builtin b : builtins) {\r
+ if (b.index < 1 || b.index > N)\r
+ throw new RuntimeDatabaseException("Illeagal resource index for builtin."\r
+ + " index=" + b.index + " uri=" + b.uri + " N=" + N);\r
+ v.set(b.index, b);\r
+ }\r
+ for (int i=1; i<N+1; ++i) {\r
+ if (v.get(i) == null)\r
+ throw new RuntimeDatabaseException("Missing builtin for resource index=" + i);\r
+ }\r
+ ClusterBase cluster = cs.getClusterByClusterUIDOrMake(ClusterUID.Builtin);\r
+ long clusterId = cluster.getClusterId();\r
+ for (int i=1; i<N+1; ++i) {\r
+ Builtin b = v.get(i);\r
+ cs.createResource(cluster, (short)b.index, clusterId);\r
+ }\r
+ cluster.setImmutable(true, cs);\r
+ }\r
+ });\r
+ } catch (DatabaseException e) {\r
+ throw new InternalException("Failed to init graph.", e);\r
+ }\r
+ }\r
+}\r