package org.infinispan.client.hotrod.impl.transport;
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
import org.infinispan.client.hotrod.logging.Log;
import org.infinispan.client.hotrod.logging.LogFactory;
/**
* Support class for transport implementations.
*
* @author Mircea.Markus@jboss.com
* @since 4.1
*/
public abstract class AbstractTransport implements Transport {
private static final Log log = LogFactory.getLog(AbstractTransport.class);
private static final boolean trace = log.isTraceEnabled();
private final TransportFactory transportFactory;
private boolean busy;
protected AbstractTransport(TransportFactory transportFactory) {
this.transportFactory = transportFactory;
}
@Override
public void setBusy(boolean busy) {
this.busy = busy;
}
@Override
public boolean isBusy() {
return busy;
}
@Override
public byte[] readArray() {
int responseLength = readVInt();
return readByteArray(responseLength);
}
@Override
public String readString() {
byte[] strContent = readArray();
String readString = new String(strContent, HotRodConstants.HOTROD_STRING_CHARSET);
if (trace) log.tracef("Read string is: %s", readString);
return readString;
}
@Override
public long readLong() {
byte[] longBytes = readByteArray(8);
long result = 0;
for (byte longByte : longBytes) {
result <<= 8;
result ^= (long) longByte & 0xFF;
}
return result;
}
@Override
public void writeLong(long longValue) {
byte[] b = new byte[8];
for (int i = 0; i < 8; i++) {
b[7 - i] = (byte) (longValue >>> (i * 8));
}
writeBytes(b);
}
@Override
public int readUnsignedShort() {
byte[] shortBytes = readByteArray(2);
int result = 0;
for (byte longByte : shortBytes) {
result <<= 8;
result ^= (long) longByte & 0xFF;
}
return result;
}
@Override
public int read4ByteInt() {
byte[] b = readByteArray(4);
int value = 0;
for (int i = 0; i < 4; i++) {
int shift = (4 - 1 - i) * 8;
value += (b[i] & 0x000000FF) << shift;
}
return value;
}
@Override
public void writeString(String string) {
if (string != null && !string.isEmpty()) {
writeArray(string.getBytes(HotRodConstants.HOTROD_STRING_CHARSET));
} else {
writeVInt(0);
}
}
@Override
public void writeOptionalString(String string) {
if (string == null) {
writeSignedVInt(-1);
} else {
writeOptionalArray(string.getBytes(HotRodConstants.HOTROD_STRING_CHARSET));
}
}
@Override
public TransportFactory getTransportFactory() {
return transportFactory;
}
@Override
public void writeArray(byte[] toAppend) {
writeVInt(toAppend.length);
writeBytes(toAppend);
}
public void writeArray(byte[] toAppend, int offset, int count) {
writeVInt(count);
writeBytes(toAppend, offset, count);
}
@Override
public void writeOptionalArray(byte[] toAppend) {
writeSignedVInt(toAppend.length);
writeBytes(toAppend);
}
protected abstract void writeBytes(byte[] toAppend);
protected abstract void writeBytes(byte[] toAppend, int offset, int count);
}