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