1 package fi.vtt.simantics.procore.internal;
3 import gnu.trove.map.hash.THashMap;
5 import java.lang.ref.SoftReference;
6 import java.util.HashSet;
8 import org.simantics.db.common.utils.Logger;
9 import org.simantics.db.exception.DatabaseException;
10 import org.simantics.db.exception.ValidationException;
11 import org.simantics.db.impl.ClusterBase;
12 import org.simantics.db.impl.ClusterSupport;
13 import org.simantics.db.impl.ResourceImpl;
14 import org.simantics.db.impl.support.BuiltinSupport;
15 import org.simantics.db.procore.cluster.ClusterTraits;
16 import org.simantics.db.service.ClusterUID;
17 import org.simantics.db.service.InitSupport;
18 import org.simantics.graph.db.CoreInitialization;
20 public class BuiltinSupportImpl implements BuiltinSupport {
21 private final boolean DEBUG = false;
22 private final SessionImplSocket session;
23 private ClusterBase builtinCluster;
24 private THashMap<String, BuiltinData> builtinMap;
25 BuiltinSupportImpl(SessionImplSocket session) {
26 this.session = session;
27 this.builtinMap = null;
28 this.builtinCluster = null;
31 public int getBuiltin(String uri) {
33 ResourceImpl impl = getBuiltinResource(uri);
36 } catch (DatabaseException e) {
39 Logger.defaultLogError("Failed to get builtin for " + uri, e);
43 private ResourceImpl getBuiltinResource(String name)
44 throws DatabaseException {
45 Logger.defaultLogTrace("Asking for builtin " + name);
47 if (null == builtinMap) {
48 ClusterSupport cs = session.getService(ClusterSupport.class);
49 builtinCluster = cs.getClusterByClusterUIDOrMake(ClusterUID.Builtin);
50 builtinMap = initBuiltinMap();
53 ResourceImpl resource = null;
54 BuiltinData builtin = null;
56 builtin = builtinMap.get(name);
57 if (null == builtin) {
58 Logger.defaultLogInfo("Asking for missing builtin " + name);
61 if (null != builtin.weakResource) {
62 resource = builtin.weakResource.get();
67 int id = ClusterTraits.createResourceKey(builtinCluster.getClusterKey(), builtin.index);
68 resource = session.getResource(id);
70 throw new ValidationException("Builtin not found index=" + builtin.index);
71 builtin.weakResource = new SoftReference<ResourceImpl>(resource);
74 private THashMap<String, BuiltinData> initBuiltinMap()
75 throws DatabaseException {
76 THashMap<String, BuiltinData> builtins = new THashMap<String, BuiltinData>();
77 HashSet<InitSupport.Builtin> t = CoreInitialization.getBuiltins();
79 for (InitSupport.Builtin b : t) {
80 if (b.index < 1 || b.index > size)
81 throw new ValidationException("Illegal builtin resource index=" + b.index);
82 BuiltinData bd = new BuiltinData(b.index);
83 builtins.put(b.uri, bd);
87 static class BuiltinData {
88 final int index; // resource index
89 SoftReference<ResourceImpl> weakResource = null;
90 BuiltinData(int index) {