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