package com.revolsys.io.endian;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import com.revolsys.io.FileUtil;
import com.revolsys.spring.resource.FileSystemResource;
import com.revolsys.spring.resource.Resource;
import com.revolsys.util.Exceptions;
public class ResourceEndianOutput implements EndianOutput {
private final File file;
private EndianOutput out;
private final Resource resource;
private OutputStream resourceOut;
public ResourceEndianOutput(final Resource resource) throws IOException {
this.resource = resource;
if (!(resource instanceof FileSystemResource)) {
this.resourceOut = resource.newBufferedOutputStream();
}
this.file = Resource.getFileOrCreateTempFile(resource);
final OutputStream out = new FileOutputStream(this.file);
final BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
this.out = new EndianOutputStream(bufferedOut);
}
@Override
public void close() {
try {
this.out.close();
} catch (final Throwable e) {
throw Exceptions.wrap(e);
} finally {
if (!(this.resource instanceof FileSystemResource)) {
try {
FileUtil.copy(this.file, this.resourceOut);
this.resourceOut.flush();
} catch (final Throwable e) {
throw Exceptions.wrap(e);
} finally {
FileUtil.closeSilent(this.resourceOut);
if (!(this.resource instanceof FileSystemResource)) {
this.file.delete();
}
}
}
}
}
@Override
public void flush() {
this.out.flush();
}
@Override
public long getFilePointer() throws IOException {
return this.out.getFilePointer();
}
@Override
public long length() throws IOException {
return this.out.length();
}
public void seek(final long pos) throws IOException {
final LittleEndianRandomAccessFile raOut;
if (this.out instanceof LittleEndianRandomAccessFile) {
raOut = (LittleEndianRandomAccessFile)this.out;
} else {
this.out.flush();
this.out.close();
raOut = new LittleEndianRandomAccessFile(this.file, "rw");
this.out = raOut;
}
raOut.seek(pos);
}
@Override
public void write(final byte[] bytes) {
this.out.write(bytes);
}
@Override
public void write(final byte[] bytes, final int offset, final int length) {
this.out.write(bytes, offset, length);
}
@Override
public void write(final int i) {
this.out.write(i);
}
@Override
public void writeBytes(final String s) {
this.out.writeBytes(s);
}
@Override
public void writeDouble(final double d) {
this.out.writeDouble(d);
}
@Override
public void writeFloat(final float f) {
this.out.writeFloat(f);
}
@Override
public void writeInt(final int i) {
this.out.writeInt(i);
}
@Override
public void writeLEDouble(final double d) {
this.out.writeLEDouble(d);
}
@Override
public void writeLEFloat(final float f) {
this.out.writeLEFloat(f);
}
@Override
public void writeLEInt(final int i) {
this.out.writeLEInt(i);
}
@Override
public void writeLELong(final long l) {
this.out.writeLELong(l);
}
@Override
public void writeLEShort(final short s) {
this.out.writeLEShort(s);
}
@Override
public void writeLEUnsignedShort(final int s) {
this.out.writeLEUnsignedShort(s);
}
@Override
public void writeLong(final long l) {
this.out.writeLong(l);
}
@Override
public void writeShort(final short s) {
this.out.writeShort(s);
}
}