/*
* JBoss, Home of Professional Open Source
* Copyright 2010 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
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 final TransportFactory transportFactory;
protected AbstractTransport(TransportFactory transportFactory) {
this.transportFactory = transportFactory;
}
@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 (log.isTraceEnabled()) {
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.isEmpty()) {
writeArray(string.getBytes(HotRodConstants.HOTROD_STRING_CHARSET));
} else {
writeVInt(0);
}
}
@Override
public TransportFactory getTransportFactory() {
return transportFactory;
}
@Override
public void writeArray(byte[] toAppend) {
writeVInt(toAppend.length);
writeBytes(toAppend);
}
protected abstract void writeBytes(byte[] toAppend);
}