// Copyright 2016 Twitter. All rights reserved.
//
// 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.twitter.heron.common.network;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Random;
/**
* RID is a unique id to identify Request; and all message not requiring request will have
* the zeroREDIQ as their RID.
* The RID is generated by calling random()
*/
public class REQID {
public static final int REQID_SIZE = 32;
public static REQID zeroREQID = generateZero();
private static Random randomGenerator = new Random(System.nanoTime());
private byte[] bytes;
public REQID(byte[] dataBytes) {
assert dataBytes.length == REQID_SIZE;
bytes = new byte[REQID_SIZE];
System.arraycopy(dataBytes, 0, bytes, 0, dataBytes.length);
}
public REQID(ByteBuffer buffer) {
bytes = new byte[REQID.REQID_SIZE];
buffer.get(bytes);
}
public static REQID generate() {
byte[] dataBytes = new byte[REQID_SIZE];
randomGenerator.nextBytes(dataBytes);
return new REQID(dataBytes);
}
private static REQID generateZero() {
byte[] dataBytes = new byte[REQID_SIZE];
Arrays.fill(dataBytes, (byte) 0);
return new REQID(dataBytes);
}
public void pack(ByteBuffer buffer) {
buffer.put(bytes);
}
public byte[] value() {
return bytes;
}
public boolean equals(Object other) {
if (other == null) {
return false;
}
if (other == this) {
return true;
}
if (!(other instanceof REQID)) {
return false;
}
REQID rother = (REQID) other;
return Arrays.equals(this.bytes, rother.value());
}
public int hashCode() {
return Arrays.hashCode(this.bytes);
}
@Override
public String toString() {
StringBuilder bldr = new StringBuilder();
for (int j = 0; j < bytes.length; j++) {
bldr.append(String.format("%02X ", bytes[j]));
}
return bldr.toString();
}
}