1 package org.simantics.db.service;
\r
3 import java.nio.ByteBuffer;
\r
4 import java.nio.ByteOrder;
\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
13 // public final long first;
\r
14 public final long second;
\r
15 // public transient int arrayOffset = -1;
\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
24 public ClusterUID() {
\r
29 public ClusterUID(long first, long second) {
\r
31 // this.first = first;
\r
32 this.second = second;
\r
35 public synchronized static ClusterUID make(long first, long second) {
\r
39 if(second == secondCache1) return clusterCache1;
\r
40 else if(second == secondCache2) return clusterCache2;
\r
42 ClusterUID result = new ClusterUID(first, second);
\r
43 secondCache2 = secondCache1; clusterCache2 = clusterCache1;
\r
44 secondCache1 = second; clusterCache1 = result;
\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
59 public String toString() {
\r
60 return String.format("%x.%x", 0, second);
\r
62 public static int getLongLength() {
\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
70 public int toLong(long[] longs, int offset) {
\r
71 longs[offset++] = 0;
\r
72 longs[offset++] = second;
\r
75 public byte[] asBytes() {
\r
76 byte[] bytes = new byte[16];
\r
80 public ResourceUID toRID(int resourceIndex) {
\r
81 return new ResourceUID(0, second, resourceIndex);
\r
84 public boolean equals(Object o) {
\r
87 else if (!(o instanceof ClusterUID))
\r
89 ClusterUID x = (ClusterUID)o;
\r
90 return /*first == x.first &&*/ second == x.second;
\r
93 public int hashCode() {
\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