blob: d277948212f1dfeda8535c04026ed0b864a7f4bd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.ignite.internal.binary.streams;
import java.nio.ByteBuffer;
import org.apache.ignite.binary.BinaryObjectException;
/**
*
*/
public class BinaryByteBufferInputStream implements BinaryInputStream {
/** */
private ByteBuffer buf;
/**
* @param buf Buffer to wrap.
* @return Stream.
*/
public static BinaryByteBufferInputStream create(ByteBuffer buf) {
return new BinaryByteBufferInputStream(buf);
}
/**
* @param buf Buffer to get data from.
*/
BinaryByteBufferInputStream(ByteBuffer buf) {
this.buf = buf;
}
/** {@inheritDoc} */
@Override public byte readByte() {
ensureHasData(1);
return buf.get();
}
/** {@inheritDoc} */
@Override public byte[] readByteArray(int cnt) {
ensureHasData(cnt);
byte[] data = new byte[cnt];
buf.get(data);
return data;
}
/** {@inheritDoc} */
@Override public int read(byte[] arr, int off, int cnt) {
ensureHasData(cnt);
return 0;
}
/** {@inheritDoc} */
@Override public boolean readBoolean() {
ensureHasData(1);
return false;
}
/** {@inheritDoc} */
@Override public boolean[] readBooleanArray(int cnt) {
ensureHasData(cnt);
boolean[] res = new boolean[cnt];
for (int i = 0; i < cnt; i++)
res[i] = buf.get() != 0;
return res;
}
/** {@inheritDoc} */
@Override public short readShort() {
ensureHasData(2);
return buf.getShort();
}
/** {@inheritDoc} */
@Override public short[] readShortArray(int cnt) {
ensureHasData(2 * cnt);
short[] res = new short[cnt];
for (int i = 0; i < cnt; i++)
res[i] = buf.getShort();
return res;
}
/** {@inheritDoc} */
@Override public char readChar() {
ensureHasData(2);
return buf.getChar();
}
/** {@inheritDoc} */
@Override public char[] readCharArray(int cnt) {
ensureHasData(2 * cnt);
char[] res = new char[cnt];
for (int i = 0; i < cnt; i++)
res[i] = buf.getChar();
return res;
}
/** {@inheritDoc} */
@Override public int readInt() {
ensureHasData(4);
return buf.getInt();
}
/** {@inheritDoc} */
@Override public int[] readIntArray(int cnt) {
ensureHasData(4 * cnt);
int[] res = new int[cnt];
for (int i = 0; i < cnt; i++)
res[i] = buf.getInt();
return res;
}
/** {@inheritDoc} */
@Override public float readFloat() {
ensureHasData(4);
return buf.getFloat();
}
/** {@inheritDoc} */
@Override public float[] readFloatArray(int cnt) {
ensureHasData(4 * cnt);
float[] res = new float[cnt];
for (int i = 0; i < cnt; i++)
res[i] = buf.getFloat();
return res;
}
/** {@inheritDoc} */
@Override public long readLong() {
ensureHasData(8);
return buf.getLong();
}
/** {@inheritDoc} */
@Override public long[] readLongArray(int cnt) {
ensureHasData(8 * cnt);
long[] res = new long[cnt];
for (int i = 0; i < cnt; i++)
res[i] = buf.getLong();
return res;
}
/** {@inheritDoc} */
@Override public double readDouble() {
ensureHasData(8);
return buf.getDouble();
}
/** {@inheritDoc} */
@Override public double[] readDoubleArray(int cnt) {
ensureHasData(8 * cnt);
double[] res = new double[cnt];
for (int i = 0; i < cnt; i++)
res[i] = buf.getDouble();
return res;
}
/** {@inheritDoc} */
@Override public int remaining() {
return buf.remaining();
}
/** {@inheritDoc} */
@Override public byte readBytePositioned(int pos) {
int oldPos = buf.position();
buf.position(pos);
ensureHasData(1);
byte res = buf.get();
buf.position(oldPos);
return res;
}
/** {@inheritDoc} */
@Override public short readShortPositioned(int pos) {
int oldPos = buf.position();
buf.position(pos);
ensureHasData(2);
short res = buf.getShort();
buf.position(oldPos);
return res;
}
/** {@inheritDoc} */
@Override public int readIntPositioned(int pos) {
int oldPos = buf.position();
buf.position(pos);
ensureHasData(4);
byte res = buf.get();
buf.position(oldPos);
return res;
}
/** {@inheritDoc} */
@Override public int position() {
return buf.position();
}
/** {@inheritDoc} */
@Override public void position(int pos) {
buf.position(pos);
}
/** {@inheritDoc} */
@Override public long rawOffheapPointer() {
return 0;
}
/** {@inheritDoc} */
@Override public int capacity() {
return buf.capacity();
}
/** {@inheritDoc} */
@Override public byte[] array() {
return buf.array();
}
/** {@inheritDoc} */
@Override public byte[] arrayCopy() {
return buf.array();
}
/** {@inheritDoc} */
@Override public long offheapPointer() {
return 0;
}
/** {@inheritDoc} */
@Override public boolean hasArray() {
return false;
}
/**
* @param cnt Remaining bytes.
*/
private void ensureHasData(int cnt) {
if (buf.remaining() < cnt)
throw new BinaryObjectException("Not enough data to read the value " +
"[requiredBytes=" + cnt + ", remainingBytes=" + buf.remaining() + ']');
}
}