]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/BuiltinSupportImpl.java
Goodbye db-client.log
[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         synchronized (this) {
46             if (null == builtinMap) {
47                 ClusterSupport cs = session.getService(ClusterSupport.class);
48                 builtinCluster = cs.getClusterByClusterUIDOrMake(ClusterUID.Builtin);
49                 builtinMap = initBuiltinMap();
50             }
51         }
52         ResourceImpl resource = null;
53         BuiltinData builtin = null;
54         synchronized (this) {
55             builtin = builtinMap.get(name);
56             if (null == builtin) {
57                 return null;
58             }
59             if (null != builtin.weakResource) { 
60                 resource = builtin.weakResource.get();
61                 if (resource != null)
62                     return resource;
63             }
64         }
65         int id = ClusterTraits.createResourceKey(builtinCluster.getClusterKey(), builtin.index);
66         resource = session.getResource(id);
67         if (null == resource)
68             throw new ValidationException("Builtin not found index=" + builtin.index);
69         builtin.weakResource = new SoftReference<ResourceImpl>(resource); 
70         return resource;
71     }
72     private THashMap<String, BuiltinData> initBuiltinMap()
73             throws DatabaseException {
74         THashMap<String, BuiltinData> builtins = new THashMap<String, BuiltinData>();
75         HashSet<InitSupport.Builtin> t = CoreInitialization.getBuiltins();
76         int size = t.size();
77         for (InitSupport.Builtin b : t) {
78             if (b.index < 1 || b.index > size)
79                 throw new ValidationException("Illegal builtin resource index=" + b.index);
80             BuiltinData bd = new BuiltinData(b.index);
81             builtins.put(b.uri, bd);
82         }
83         return builtins;
84     }
85     static class BuiltinData {
86         final int index; // resource index
87         SoftReference<ResourceImpl> weakResource = null;
88         BuiltinData(int index) {
89             this.index = index;
90         }
91     }
92 }