]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db/src/org/simantics/db/service/ClusterUID.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db / src / org / simantics / db / service / ClusterUID.java
diff --git a/bundles/org.simantics.db/src/org/simantics/db/service/ClusterUID.java b/bundles/org.simantics.db/src/org/simantics/db/service/ClusterUID.java
new file mode 100644 (file)
index 0000000..adfaed4
--- /dev/null
@@ -0,0 +1,101 @@
+package org.simantics.db.service;\r
+\r
+import java.nio.ByteBuffer;\r
+import java.nio.ByteOrder;\r
+\r
+public final class ClusterUID {\r
+    public static final ClusterUID Null = new ClusterUID(0, 0);\r
+    public static final ClusterUID Reserved = new ClusterUID(0, 1);\r
+    public static final ClusterUID Builtin = new ClusterUID(0, 2);\r
+    public static boolean isLegal(ClusterUID clusterUID) {\r
+        return !clusterUID.equals(Null) && !clusterUID.equals(Reserved);\r
+    }\r
+//    public final long first;\r
+    public final long second;\r
+//    public transient int arrayOffset = -1;\r
+\r
+//    transient private static long firstCache1 = 0;\r
+//    transient private static long firstCache2 = 0;\r
+    transient private static long secondCache1 = 0;\r
+    transient private static long secondCache2 = 0;\r
+    transient private static ClusterUID clusterCache1 = null;\r
+    transient private static ClusterUID clusterCache2 = null;\r
+\r
+    public ClusterUID() {\r
+//        first = 0;\r
+        second = 0;\r
+    }\r
+\r
+    public ClusterUID(long first, long second) {\r
+       assert(first == 0);\r
+//        this.first = first;\r
+        this.second = second;\r
+    }\r
+\r
+    public synchronized static ClusterUID make(long first, long second) {\r
+\r
+       assert(first == 0);\r
+\r
+        if(second == secondCache1) return clusterCache1;\r
+        else if(second == secondCache2) return clusterCache2;\r
+        else {\r
+            ClusterUID result = new ClusterUID(first, second);\r
+            secondCache2 = secondCache1; clusterCache2 = clusterCache1;\r
+            secondCache1 = second; clusterCache1 = result;\r
+            return result;\r
+        }\r
+\r
+    }\r
+\r
+    public static ClusterUID make(byte[] bytes, int offset) {\r
+        if (bytes.length < offset + 16)\r
+            throw new IllegalArgumentException("Too few bytes for ClusteUID. length=" + bytes.length + " offset=" + offset);\r
+        ByteBuffer bf = ByteBuffer.wrap(bytes, offset, 16);\r
+        bf.order(ByteOrder.LITTLE_ENDIAN);\r
+        return make(bf.getLong(),bf.getLong());\r
+    }\r
+\r
+    @Override\r
+    public String toString() {\r
+        return String.format("%x.%x", 0, second);\r
+    }\r
+    public static int getLongLength() {\r
+        return 2;\r
+    }\r
+    public int toByte(byte[] bytes, int offset) {\r
+        Bytes.writeLE(bytes, offset+0, 0);\r
+        Bytes.writeLE(bytes, offset+8, second);\r
+        return offset + 16;\r
+    }\r
+    public int toLong(long[] longs, int offset) {\r
+        longs[offset++] = 0;\r
+        longs[offset++] = second;\r
+        return offset;\r
+    }\r
+    public byte[] asBytes() {\r
+        byte[] bytes = new byte[16];\r
+        toByte(bytes, 0);\r
+        return bytes;\r
+    }\r
+    public ResourceUID toRID(int resourceIndex) {\r
+        return new ResourceUID(0, second, resourceIndex);\r
+    }\r
+    @Override\r
+    public boolean equals(Object o) {\r
+        if (this == o)\r
+            return true;\r
+        else if (!(o instanceof ClusterUID))\r
+            return false;\r
+        ClusterUID x = (ClusterUID)o;\r
+        return /*first == x.first &&*/ second == x.second;\r
+    }\r
+    @Override\r
+    public int hashCode() {\r
+        int result = 17;\r
+//        int f = (int)(0 ^ (0 >>> 32));\r
+//        result = 31 * result + f;\r
+        int s = (int)(second ^ (second >>> 32));\r
+        result = 31 * result + s;\r
+        return result;\r
+    }\r
+}\r