]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/BuiltinSupportImpl.java
Multiple reader thread support for db client
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / BuiltinSupportImpl.java
1 package fi.vtt.simantics.procore.internal;
2
3 import gnu.trove.map.hash.THashMap;
4
5 import java.lang.ref.SoftReference;
6 import java.util.HashSet;
7
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;
19
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;
29     }
30     @Override
31     public int getBuiltin(String uri) {
32         try {
33             ResourceImpl impl = getBuiltinResource(uri);
34             if (impl != null)
35                 return impl.id;
36         } catch (DatabaseException e) {
37             if (DEBUG)
38                 e.printStackTrace();
39             Logger.defaultLogError("Failed to get builtin for " + uri, e);
40         }
41         return 0;
42     }
43     private ResourceImpl getBuiltinResource(String name)
44     throws DatabaseException {
45         Logger.defaultLogTrace("Asking for builtin " + name);
46         synchronized (this) {
47             if (null == builtinMap) {
48                 ClusterSupport cs = session.getService(ClusterSupport.class);
49                 builtinCluster = cs.getClusterByClusterUIDOrMake(ClusterUID.Builtin);
50                 builtinMap = initBuiltinMap();
51             }
52         }
53         ResourceImpl resource = null;
54         BuiltinData builtin = null;
55         synchronized (this) {
56             builtin = builtinMap.get(name);
57             if (null == builtin) {
58                 Logger.defaultLogInfo("Asking for missing builtin " + name);
59                 return null;
60             }
61             if (null != builtin.weakResource) { 
62                 resource = builtin.weakResource.get();
63                 if (resource != null)
64                     return resource;
65             }
66         }
67         int id = ClusterTraits.createResourceKey(builtinCluster.getClusterKey(), builtin.index);
68         resource = session.getResource(id);
69         if (null == resource)
70             throw new ValidationException("Builtin not found index=" + builtin.index);
71         builtin.weakResource = new SoftReference<ResourceImpl>(resource); 
72         return resource;
73     }
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();
78         int size = t.size();
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);
84         }
85         return builtins;
86     }
87     static class BuiltinData {
88         final int index; // resource index
89         SoftReference<ResourceImpl> weakResource = null;
90         BuiltinData(int index) {
91             this.index = index;
92         }
93     }
94 }