/*
* Copyright 2015 the original author or authors.
*
* 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 io.atomix.catalyst.buffer;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
* Output stream output.
*
* @author <a href="http://github.com/kuujo">Jordan Halterman</a>
*/
public class OutputStreamBufferOutput implements BufferOutput<BufferOutput<?>> {
private final DataOutputStream os;
public OutputStreamBufferOutput(OutputStream os) {
this(new DataOutputStream(os));
}
public OutputStreamBufferOutput(DataOutputStream os) {
if (os == null)
throw new NullPointerException("output stream cannot be null");
this.os = os;
}
@Override
public BufferOutput<?> write(Bytes bytes) {
if (bytes instanceof UnsafeHeapBytes) {
try {
os.write(bytes.array());
} catch (IOException e) {
throw new CatalystIOException(e);
}
} else {
byte[] buffer = new byte[(int) bytes.size()];
bytes.read(0, buffer, 0, buffer.length);
try {
os.write(buffer);
} catch (IOException e) {
throw new CatalystIOException(e);
}
}
return this;
}
@Override
public BufferOutput<?> write(byte[] bytes) {
try {
os.write(bytes);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> write(Bytes bytes, long offset, long length) {
if (bytes instanceof UnsafeHeapBytes) {
try {
os.write(((UnsafeHeapBytes) bytes).array(), (int) offset, (int) length);
} catch (IOException e) {
throw new CatalystIOException(e);
}
} else {
byte[] buffer = new byte[(int) bytes.size()];
bytes.read(0, buffer, 0, buffer.length);
try {
os.write(buffer, (int) offset, (int) length);
} catch (IOException e) {
throw new CatalystIOException(e);
}
}
return this;
}
@Override
public BufferOutput<?> write(byte[] bytes, long offset, long length) {
try {
os.write(bytes, (int) offset, (int) length);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> write(Buffer buffer) {
if (buffer instanceof UnsafeHeapBuffer) {
try {
os.write(((UnsafeHeapBuffer) buffer).array());
} catch (IOException e) {
throw new CatalystIOException(e);
}
} else {
byte[] bytes = new byte[(int) buffer.remaining()];
buffer.read(bytes);
try {
os.write(bytes);
} catch (IOException e) {
throw new CatalystIOException(e);
}
}
return this;
}
@Override
public BufferOutput<?> writeByte(int b) {
try {
os.writeByte(b);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeUnsignedByte(int b) {
try {
os.writeByte(b);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeChar(char c) {
try {
os.writeChar(c);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeShort(short s) {
try {
os.writeShort(s);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeUnsignedShort(int s) {
try {
os.writeShort(s);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeMedium(int m) {
try {
os.writeByte((byte) (m >>> 16));
os.writeByte((byte) (m >>> 8));
os.writeByte((byte) m);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeUnsignedMedium(int m) {
return writeMedium(m);
}
@Override
public BufferOutput<?> writeInt(int i) {
try {
os.writeInt(i);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeUnsignedInt(long i) {
try {
os.writeInt((int) i);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeLong(long l) {
try {
os.writeLong(l);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeFloat(float f) {
try {
os.writeFloat(f);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeDouble(double d) {
try {
os.writeDouble(d);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeBoolean(boolean b) {
try {
os.writeBoolean(b);
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public BufferOutput<?> writeString(String s) {
return writeString(s, Charset.defaultCharset());
}
@Override
public BufferOutput<?> writeString(String s, Charset charset) {
if (s == null) {
return writeBoolean(Boolean.FALSE);
} else {
byte[] bytes = s.getBytes(charset);
writeBoolean(Boolean.TRUE);
return writeUnsignedShort(bytes.length)
.write(bytes, 0, bytes.length);
}
}
@Override
public BufferOutput<?> writeUTF8(String s) {
return writeString(s, StandardCharsets.UTF_8);
}
@Override
public BufferOutput<?> flush() {
try {
os.flush();
} catch (IOException e) {
throw new CatalystIOException(e);
}
return this;
}
@Override
public void close() {
try {
os.close();
} catch (IOException e) {
throw new CatalystIOException(e);
}
}
}