--- /dev/null
+package fi.vtt.simantics.procore.internal;\r
+\r
+import java.io.InputStream;\r
+\r
+import org.simantics.db.Session;\r
+import org.simantics.db.common.utils.Logger;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.impl.ClusterBase;\r
+import org.simantics.db.impl.ClusterTranslator;\r
+import org.simantics.db.impl.IClusterTable;\r
+import org.simantics.db.impl.ResourceImpl;\r
+import org.simantics.db.procore.cluster.ClusterImpl;\r
+import org.simantics.db.service.ClusterUID;\r
+\r
+public class ClusterTranslatorImpl implements ClusterTranslator {\r
+\r
+ final private SessionImplSocket session;\r
+ final private ClusterStream clusterStream;\r
+ final private ClusterTable clusterTable;\r
+\r
+ ClusterTranslatorImpl(SessionImplSocket session) {\r
+ this.session = session;\r
+ this.clusterStream = session.clusterStream;\r
+ this.clusterTable = session.clusterTable;\r
+ }\r
+\r
+ @Override\r
+ public byte[] getValueEx(int resourceIndex, long clusterId)\r
+ throws DatabaseException {\r
+ return session.graphSession.getResourceValue(resourceIndex, clusterTable.makeClusterUID(clusterId));\r
+ }\r
+\r
+ @Override\r
+ public InputStream getValueStreamEx(int resourceIndex, long clusterId)\r
+ throws DatabaseException {\r
+ return session.graphSession.getResourceValueStream(resourceIndex, clusterTable.makeClusterUID(clusterId), 0, 0);\r
+ }\r
+\r
+ @Override\r
+ public byte[] getValueEx(int resourceIndex, long clusterId, long voffset, int length)\r
+ throws DatabaseException {\r
+ return session.graphSession.getResourceValue(resourceIndex, clusterTable.makeClusterUID(clusterId), voffset, length);\r
+ }\r
+\r
+ public long getValueSizeEx(int resourceIndex, long clusterId)\r
+ throws DatabaseException {\r
+ return session.graphSession.getResourceValueSize(resourceIndex, clusterTable.makeClusterUID(clusterId));\r
+ }\r
+ public int wait4RequestsLess(int limit)\r
+ throws DatabaseException {\r
+ return session.graphSession.wait4RequestsLess(limit);\r
+ }\r
+ @Override\r
+ public int createClusterKeyByClusterUID(ClusterUID clusterUID, long clusterId) {\r
+ return clusterTable.makeProxy(clusterUID, clusterId).getClusterKey();\r
+ }\r
+ @Override\r
+ public int getClusterKeyByClusterUIDOrMake(ClusterUID clusterUID) {\r
+ return clusterTable.getClusterKeyByClusterUIDOrMakeProxy(clusterUID);\r
+ }\r
+ @Override\r
+ public int getClusterKeyByClusterUIDOrMake(long id1, long id2) {\r
+ return clusterTable.getClusterKeyByClusterUIDOrMakeProxy(id1, id2);\r
+ }\r
+ @Override\r
+ public ClusterBase getClusterByClusterUIDOrMake(ClusterUID clusterUID) {\r
+ return clusterTable.getClusterByClusterUIDOrMakeProxy(clusterUID);\r
+ }\r
+ @Override\r
+ final public ClusterBase getClusterByClusterId(long clusterId) {\r
+ ClusterBase cluster = clusterTable.getClusterByClusterId(clusterId);\r
+ if (null != cluster)\r
+ return cluster;\r
+ try {\r
+ return clusterTable.getLoadOrThrow(clusterId);\r
+ } catch (DatabaseException e) {\r
+ e.printStackTrace();\r
+ Logger.defaultLogError("Cluster not found by id. cluster id=" + clusterId, e);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public ClusterBase getClusterByClusterKey(int clusterKey) {\r
+ ClusterBase proxy = clusterTable.getClusterByClusterKey(clusterKey);\r
+ if (null == proxy)\r
+ return null; // throw new ResourceNotFoundException(id);\r
+ return proxy;\r
+ }\r
+\r
+ @Override\r
+ public ClusterBase getClusterByResourceKey(int resourceKey) {\r
+\r
+ ClusterBase proxy = clusterTable.getClusterByResourceKey(resourceKey);\r
+ if (null == proxy)\r
+ return null; // throw new ResourceNotFoundException(id);\r
+\r
+ return proxy;\r
+\r
+ }\r
+ @Override\r
+ public long getClusterIdOrCreate(ClusterUID clusterUID) {\r
+ return clusterTable.getClusterIdOrCreate(clusterUID);\r
+ }\r
+ @Override\r
+ public void createResource(Object cluster, short resourceIndex, long clusterId) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ if (null == clusterStream) {\r
+ System.out.println("Temporary skip of clusterStream.createResource");\r
+ return;\r
+ } else\r
+ clusterStream.createResource(impl.cc, resourceIndex, clusterTable.makeClusterUID(clusterId));\r
+ }\r
+\r
+ @Override\r
+ public void addStatementIndex(Object cluster, int resourceKey, ClusterUID clusterUID, byte op) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if (null == impl.change)\r
+ return;\r
+ clusterStream.addStatementIndex(impl.change, resourceKey, clusterUID, op);\r
+ }\r
+\r
+ @Override\r
+ public void addStatement(Object cluster) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.addStatement(impl.cc, impl.change);\r
+ }\r
+\r
+\r
+ @Override\r
+ public void cancelStatement(Object cluster) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.cancelStatement(impl.change);\r
+ }\r
+\r
+ @Override\r
+ public void removeStatement(Object cluster) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.removeStatement(impl.cc, impl.change);\r
+ }\r
+\r
+ @Override\r
+ public void cancelValue(Object cluster) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.cancelValue(impl.change);\r
+ }\r
+\r
+ @Override\r
+ public void removeValue(Object cluster) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.removeValue(impl.cc, impl.change);\r
+ }\r
+\r
+ @Override\r
+ public void setValue(Object cluster, long clusterId, byte[] bytes, int length) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.setValue(impl.cc, impl.change, clusterId, bytes, length);\r
+ }\r
+\r
+ @Override\r
+ public void modiValue(Object cluster, long clusterId, long voffset, int length, byte[] bytes, int offset) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.modiValue(impl.cc, impl.change, clusterId, voffset, length, bytes, offset);\r
+ }\r
+\r
+ @Override\r
+ public void setStreamOff(boolean setOff) {\r
+ clusterStream.setOff(setOff);\r
+ }\r
+\r
+ @Override\r
+ public boolean getStreamOff() {\r
+ return clusterStream.getOff();\r
+ }\r
+\r
+ @Override\r
+ public void setImmutable(Object cluster, boolean immutable) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ clusterTable.markImmutable(impl, immutable);\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.setImmutable(impl.cc, impl.change, immutable);\r
+ }\r
+\r
+ @Override\r
+ public void setDeleted(Object cluster, boolean deleted) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ //clusterTable.markDeleted(impl, deleted);\r
+ if (impl.cc == null)\r
+ impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.setDeleted(impl.cc, impl.change, deleted);\r
+ }\r
+\r
+ @Override\r
+ public void undoValueEx(Object cluster, int resourceIndex) {\r
+ ClusterImpl impl = (ClusterImpl)cluster;\r
+ if(impl.cc == null) impl.cc = new ClusterChange(clusterStream, impl);\r
+ clusterStream.undoValueEx(impl.cc, impl.change, resourceIndex);\r
+ }\r
+\r
+ @Override\r
+ public ResourceImpl getResource(int id) {\r
+ return new ResourceImpl(session.resourceSupport, id);\r
+ }\r
+\r
+ @Override\r
+ public ResourceImpl getResource(int callerThread, int id) {\r
+ assert (id != 0);\r
+ return new ResourceImpl(session.resourceSupport, id);\r
+ }\r
+\r
+ @Override\r
+ public Session getSession() {\r
+ return session;\r
+ }\r
+\r
+ @Override\r
+ public IClusterTable getClusterTable() {\r
+ return clusterTable;\r
+ }\r
+\r
+}\r