]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.db.service;\r
2 \r
3 import java.nio.ByteBuffer;\r
4 import java.nio.ByteOrder;\r
5 \r
6 public final class ClusterUID {\r
7     public static final ClusterUID Null = new ClusterUID(0, 0);\r
8     public static final ClusterUID Reserved = new ClusterUID(0, 1);\r
9     public static final ClusterUID Builtin = new ClusterUID(0, 2);\r
10     public static boolean isLegal(ClusterUID clusterUID) {\r
11         return !clusterUID.equals(Null) && !clusterUID.equals(Reserved);\r
12     }\r
13 //    public final long first;\r
14     public final long second;\r
15 //    public transient int arrayOffset = -1;\r
16 \r
17 //    transient private static long firstCache1 = 0;\r
18 //    transient private static long firstCache2 = 0;\r
19     transient private static long secondCache1 = 0;\r
20     transient private static long secondCache2 = 0;\r
21     transient private static ClusterUID clusterCache1 = null;\r
22     transient private static ClusterUID clusterCache2 = null;\r
23 \r
24     public ClusterUID() {\r
25 //        first = 0;\r
26         second = 0;\r
27     }\r
28 \r
29     public ClusterUID(long first, long second) {\r
30         assert(first == 0);\r
31 //        this.first = first;\r
32         this.second = second;\r
33     }\r
34 \r
35     public synchronized static ClusterUID make(long first, long second) {\r
36 \r
37         assert(first == 0);\r
38 \r
39         if(second == secondCache1) return clusterCache1;\r
40         else if(second == secondCache2) return clusterCache2;\r
41         else {\r
42             ClusterUID result = new ClusterUID(first, second);\r
43             secondCache2 = secondCache1; clusterCache2 = clusterCache1;\r
44             secondCache1 = second; clusterCache1 = result;\r
45             return result;\r
46         }\r
47 \r
48     }\r
49 \r
50     public static ClusterUID make(byte[] bytes, int offset) {\r
51         if (bytes.length < offset + 16)\r
52             throw new IllegalArgumentException("Too few bytes for ClusteUID. length=" + bytes.length + " offset=" + offset);\r
53         ByteBuffer bf = ByteBuffer.wrap(bytes, offset, 16);\r
54         bf.order(ByteOrder.LITTLE_ENDIAN);\r
55         return make(bf.getLong(),bf.getLong());\r
56     }\r
57 \r
58     @Override\r
59     public String toString() {\r
60         return String.format("%x.%x", 0, second);\r
61     }\r
62     public static int getLongLength() {\r
63         return 2;\r
64     }\r
65     public int toByte(byte[] bytes, int offset) {\r
66         Bytes.writeLE(bytes, offset+0, 0);\r
67         Bytes.writeLE(bytes, offset+8, second);\r
68         return offset + 16;\r
69     }\r
70     public int toLong(long[] longs, int offset) {\r
71         longs[offset++] = 0;\r
72         longs[offset++] = second;\r
73         return offset;\r
74     }\r
75     public byte[] asBytes() {\r
76         byte[] bytes = new byte[16];\r
77         toByte(bytes, 0);\r
78         return bytes;\r
79     }\r
80     public ResourceUID toRID(int resourceIndex) {\r
81         return new ResourceUID(0, second, resourceIndex);\r
82     }\r
83     @Override\r
84     public boolean equals(Object o) {\r
85         if (this == o)\r
86             return true;\r
87         else if (!(o instanceof ClusterUID))\r
88             return false;\r
89         ClusterUID x = (ClusterUID)o;\r
90         return /*first == x.first &&*/ second == x.second;\r
91     }\r
92     @Override\r
93     public int hashCode() {\r
94         int result = 17;\r
95 //        int f = (int)(0 ^ (0 >>> 32));\r
96 //        result = 31 * result + f;\r
97         int s = (int)(second ^ (second >>> 32));\r
98         result = 31 * result + s;\r
99         return result;\r
100     }\r
101 }\r