--- /dev/null
+package fi.vtt.simantics.procore.internal;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+\r
+import java.lang.ref.SoftReference;\r
+import java.util.HashSet;\r
+\r
+import org.simantics.db.common.utils.Logger;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.exception.ValidationException;\r
+import org.simantics.db.impl.ClusterBase;\r
+import org.simantics.db.impl.ClusterSupport;\r
+import org.simantics.db.impl.ResourceImpl;\r
+import org.simantics.db.impl.support.BuiltinSupport;\r
+import org.simantics.db.procore.cluster.ClusterTraits;\r
+import org.simantics.db.service.ClusterUID;\r
+import org.simantics.db.service.InitSupport;\r
+import org.simantics.graph.db.CoreInitialization;\r
+\r
+public class BuiltinSupportImpl implements BuiltinSupport {\r
+ private final boolean DEBUG = false;\r
+ private final SessionImplSocket session;\r
+ private ClusterBase builtinCluster;\r
+ private THashMap<String, BuiltinData> builtinMap;\r
+ BuiltinSupportImpl(SessionImplSocket session) {\r
+ this.session = session;\r
+ this.builtinMap = null;\r
+ this.builtinCluster = null;\r
+ }\r
+ @Override\r
+ public int getBuiltin(String uri) {\r
+ try {\r
+ ResourceImpl impl = getBuiltinResource(uri);\r
+ if (impl != null)\r
+ return impl.id;\r
+ } catch (DatabaseException e) {\r
+ if (DEBUG)\r
+ e.printStackTrace();\r
+ Logger.defaultLogError("Failed to get builtin for " + uri, e);\r
+ }\r
+ return 0;\r
+ }\r
+ private ResourceImpl getBuiltinResource(String name)\r
+ throws DatabaseException {\r
+ Logger.defaultLogTrace("Asking for builtin " + name);\r
+ synchronized (this) {\r
+ if (null == builtinMap) {\r
+ ClusterSupport cs = session.getService(ClusterSupport.class);\r
+ builtinCluster = cs.getClusterByClusterUIDOrMake(ClusterUID.Builtin);\r
+ builtinMap = initBuiltinMap();\r
+ }\r
+ }\r
+ ResourceImpl resource = null;\r
+ BuiltinData builtin = null;\r
+ synchronized (this) {\r
+ builtin = builtinMap.get(name);\r
+ if (null == builtin) {\r
+ Logger.defaultLogInfo("Asking for missing builtin " + name);\r
+ return null;\r
+ }\r
+ if (null != builtin.weakResource) { \r
+ resource = builtin.weakResource.get();\r
+ if (resource != null)\r
+ return resource;\r
+ }\r
+ }\r
+ int id = ClusterTraits.createResourceKey(builtinCluster.getClusterKey(), builtin.index);\r
+ resource = session.getResource(id);\r
+ if (null == resource)\r
+ throw new ValidationException("Builtin not found index=" + builtin.index);\r
+ builtin.weakResource = new SoftReference<ResourceImpl>(resource); \r
+ return resource;\r
+ }\r
+ private THashMap<String, BuiltinData> initBuiltinMap()\r
+ throws DatabaseException {\r
+ THashMap<String, BuiltinData> builtins = new THashMap<String, BuiltinData>();\r
+ HashSet<InitSupport.Builtin> t = CoreInitialization.getBuiltins();\r
+ int size = t.size();\r
+ for (InitSupport.Builtin b : t) {\r
+ if (b.index < 1 || b.index > size)\r
+ throw new ValidationException("Illegal builtin resource index=" + b.index);\r
+ BuiltinData bd = new BuiltinData(b.index);\r
+ builtins.put(b.uri, bd);\r
+ }\r
+ return builtins;\r
+ }\r
+ static class BuiltinData {\r
+ final int index; // resource index\r
+ SoftReference<ResourceImpl> weakResource = null;\r
+ BuiltinData(int index) {\r
+ this.index = index;\r
+ }\r
+ }\r
+}\r