--- /dev/null
+package fi.vtt.simantics.procore.internal;\r
+\r
+import java.util.Arrays;\r
+\r
+import org.simantics.db.procore.cluster.ClusterImpl;\r
+import org.simantics.db.service.Bytes;\r
+import org.simantics.db.service.ClusterUID;\r
+\r
+class ClusterChange2 {\r
+ public static final int VERSION = 2;\r
+ public static final byte SET_IMMUTABLE_OPERATION = 1; // <byte : 0 = false>\r
+ public static final byte UNDO_VALUE_OPERATION = 2; // <int : resource index>\r
+ public static final byte SET_DELETED_OPERATION = 3; // <byte : 0 = false>\r
+ private static final int INCREMENT = 1<<10;\r
+ private boolean dirty = false;\r
+ private byte[] bytes;\r
+ private int byteIndex;\r
+ private ClusterUID clusterUID;\r
+ ClusterChange2(ClusterUID clusterUID, ClusterImpl cluster) {\r
+ this.clusterUID = clusterUID;\r
+ init();\r
+ }\r
+ void init() {\r
+// System.err.println("clusterChange2 dirty " + cluster.clusterId);\r
+ dirty = false;\r
+ bytes = new byte[INCREMENT];\r
+ byteIndex = 0;\r
+ addInt(0); // Size of byte vector. Set by flush.\r
+ addInt(VERSION);\r
+ byteIndex = clusterUID.toByte(bytes, 8);\r
+ }\r
+ boolean isDirty() {\r
+ return dirty;\r
+ }\r
+ void flush(GraphSession graphSession) {\r
+// System.err.println("flush2 clusterChange2 " + dirty + this);\r
+ if (!dirty)\r
+ return;\r
+ Bytes.writeLE(bytes, 0, byteIndex - 4);\r
+ byte[] ops = Arrays.copyOf(bytes, byteIndex);\r
+// System.err.println("flush2 clusterChange2 " + cluster.clusterId + " " + ops.length + " bytes.");\r
+ graphSession.updateCluster(new UpdateClusterFunction(ops));\r
+ init();\r
+ }\r
+ void setImmutable(boolean immutable) {\r
+ dirty = true;\r
+ addByte(SET_IMMUTABLE_OPERATION);\r
+ addByte((byte)(immutable ? -1 : 0));\r
+ }\r
+ void setDeleted(boolean deleted) {\r
+ dirty = true;\r
+ addByte(SET_DELETED_OPERATION);\r
+ addByte((byte)(deleted ? -1 : 0));\r
+ }\r
+ void undoValueEx(int resourceIndex) {\r
+ dirty = true;\r
+ addByte(UNDO_VALUE_OPERATION);\r
+ addInt(resourceIndex);\r
+ }\r
+ private final void checkSpace(int len) {\r
+ if (bytes.length - byteIndex > len)\r
+ return;\r
+ bytes = Arrays.copyOf(bytes, bytes.length + len + INCREMENT);\r
+ }\r
+ private final void addByte(byte value) {\r
+ checkSpace(1);\r
+ bytes[byteIndex++] = value;\r
+ }\r
+ private final void addInt(int value) {\r
+ checkSpace(4);\r
+ Bytes.writeLE(bytes, byteIndex, value);\r
+ byteIndex += 4;\r
+ }\r
+}\r