package org.csc.phynixx.common.io;
/*
* #%L
* phynixx-common
* %%
* Copyright (C) 2014 Christoph Schmidt-Casdorff
* %%
* 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.
* #L%
*/
import org.apache.commons.io.IOUtils;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
* Created by christoph on 12.01.14.
*/
public class LogRecordWriter {
private final ByteArrayOutputStream byteInput;
private final DataOutputStream io;
public LogRecordWriter() {
this.byteInput = new ByteArrayOutputStream();
this.io = new DataOutputStream(this.byteInput);
}
public byte[] toByteArray() throws IOException {
this.io.flush();
return byteInput.toByteArray();
}
public LogRecordWriter writeChar(int v) throws IOException {
io.writeChar(v);
return this;
}
public LogRecordWriter writeShort(int v) throws IOException {
io.writeShort(v);
return this;
}
public LogRecordWriter writeInt(int v) throws IOException {
io.writeInt(v);
return this;
}
public LogRecordWriter writeLong(long v) throws IOException {
io.writeLong(v);
return this;
}
public LogRecordWriter writeFloat(float v) throws IOException {
io.writeFloat(v);
return this;
}
public LogRecordWriter writeDouble(double v) throws IOException {
io.writeDouble(v);
return this;
}
public LogRecordWriter writeUTF(String str) throws IOException {
io.writeUTF(str);
return this;
}
public LogRecordWriter writeByte(byte b) throws IOException {
io.writeByte(b);
return this;
}
public LogRecordWriter writeBoolean(boolean v) throws IOException {
io.writeBoolean(v);
return this;
}
/**
* write the object's class name to check the consistency if the restroe fails.
*
* A null object is accepted
*
* @param object serializable object. it has to fullfill the requirements of {@link java.io.ObjectOutputStream#writeObject(Object)} .
* @return returns the fluent API
* @throws IOException
*/
public LogRecordWriter writeObject(Object object) throws IOException {
if( object==null) {
return this.writeNullObject();
}
ObjectOutputStream out=null;
try {
ByteArrayOutputStream byteOutput= new ByteArrayOutputStream();
out = new ObjectOutputStream(byteOutput);
out.writeObject(object);
out.flush();
byte[] serBytes=byteOutput.toByteArray();
io.writeInt(serBytes.length);
io.write(serBytes);
} finally {
if(out!=null) {
IOUtils.closeQuietly(out);
}
}
return this;
}
/**
* A null object is accepted
*
* @return returns the fluent API
* @throws IOException
*/
private LogRecordWriter writeNullObject() throws IOException {
io.writeInt(0);
io.write(new byte[] {});
return this;
}
public void close() {
if (this.byteInput != null) {
try {
this.io.flush();
} catch (IOException e) {
// close may not fail
}
IOUtils.closeQuietly(this.byteInput);
}
}
}