com.scylladb.cdc.model.worker.TimeUUID Maven / Gradle / Ivy
/*
* Copyright DataStax, Inc.
*
* Copyright (C) 2021 ScyllaDB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.scylladb.cdc.model.worker;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.UUID;
// Implementation ported from Scylla Java Driver 3.x,
// UUIDs class.
class TimeUUID {
private static final long START_EPOCH = makeEpoch();
private static final long MIN_CLOCK_SEQ_AND_NODE = 0x8080808080808080L;
private static final long MAX_CLOCK_SEQ_AND_NODE = 0x7f7f7f7f7f7f7f7fL;
protected static UUID startOf(long timestamp) {
return new UUID(makeMSB(fromUnixTimestamp(timestamp)), MIN_CLOCK_SEQ_AND_NODE);
}
protected static UUID endOf(long timestamp) {
return new UUID(makeMSB(fromUnixTimestamp(timestamp + 1) - 1), MAX_CLOCK_SEQ_AND_NODE);
}
protected static UUID middleOf(long timestamp) {
return new UUID(makeMSB(fromUnixTimestamp(timestamp) + 5000), 0);
}
private static long fromUnixTimestamp(long tstamp) {
return (tstamp - START_EPOCH) * 10000;
}
private static long makeMSB(long timestamp) {
long msb = 0L;
msb |= (0x00000000ffffffffL & timestamp) << 32;
msb |= (0x0000ffff00000000L & timestamp) >>> 16;
msb |= (0x0fff000000000000L & timestamp) >>> 48;
msb |= 0x0000000000001000L; // sets the version to 1.
return msb;
}
private static long makeEpoch() {
// UUID v1 timestamp must be in 100-nanoseconds interval since 00:00:00.000 15 Oct 1582.
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT-0"));
c.set(Calendar.YEAR, 1582);
c.set(Calendar.MONTH, Calendar.OCTOBER);
c.set(Calendar.DAY_OF_MONTH, 15);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
return c.getTimeInMillis();
}
}