]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/BuiltinSupportImpl.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / BuiltinSupportImpl.java
diff --git a/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/BuiltinSupportImpl.java b/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/BuiltinSupportImpl.java
new file mode 100644 (file)
index 0000000..482af7d
--- /dev/null
@@ -0,0 +1,94 @@
+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