From ce472729d66bb6e1ef886d2d93d99c0184ab34aa Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 9 Mar 2023 07:14:48 -0600 Subject: [PATCH] append Dh to unclosableStreams and refactor --- .../fullData/sources/FullDataSource.java | 4 ++-- .../sources/SingleChunkFullDataSource.java | 4 ++-- .../dataObjects/render/ColumnRenderSource.java | 11 +++++------ .../file/fullDatafile/FullDataFileHandler.java | 3 ++- .../file/fullDatafile/FullDataMetaFile.java | 2 +- .../metaData/AbstractMetaDataContainerFile.java | 17 +++++++++-------- .../file/renderfile/RenderMetaDataFile.java | 2 +- ...Stream.java => DhUnclosableInputStream.java} | 4 ++-- ...tream.java => DhUnclosableOutputStream.java} | 4 ++-- 9 files changed, 26 insertions(+), 25 deletions(-) rename core/src/main/java/com/seibel/lod/core/util/objects/{UnclosableInputStream.java => DhUnclosableInputStream.java} (67%) rename core/src/main/java/com/seibel/lod/core/util/objects/{UnclosableOutputStream.java => DhUnclosableOutputStream.java} (64%) diff --git a/core/src/main/java/com/seibel/lod/core/dataObjects/fullData/sources/FullDataSource.java b/core/src/main/java/com/seibel/lod/core/dataObjects/fullData/sources/FullDataSource.java index 26d3245cc..4facc5f46 100644 --- a/core/src/main/java/com/seibel/lod/core/dataObjects/fullData/sources/FullDataSource.java +++ b/core/src/main/java/com/seibel/lod/core/dataObjects/fullData/sources/FullDataSource.java @@ -10,7 +10,7 @@ import com.seibel.lod.core.pos.DhLodPos; import com.seibel.lod.core.file.fullDatafile.FullDataMetaFile; import com.seibel.lod.core.pos.DhSectionPos; import com.seibel.lod.core.util.BitShiftUtil; -import com.seibel.lod.core.util.objects.UnclosableInputStream; +import com.seibel.lod.core.util.objects.DhUnclosableInputStream; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.util.LodUtil; import org.apache.logging.log4j.Logger; @@ -245,7 +245,7 @@ public class FullDataSource extends FullArrayView implements IFullDataSource throw new IOException("invalid data content end guard"); } - FullDataPointIdMap mapping = FullDataPointIdMap.deserialize(new UnclosableInputStream(dos)); + FullDataPointIdMap mapping = FullDataPointIdMap.deserialize(new DhUnclosableInputStream(dos)); end = dos.readInt(); if (end != 0xFFFFFFFF) { diff --git a/core/src/main/java/com/seibel/lod/core/dataObjects/fullData/sources/SingleChunkFullDataSource.java b/core/src/main/java/com/seibel/lod/core/dataObjects/fullData/sources/SingleChunkFullDataSource.java index 13e976671..245695f98 100644 --- a/core/src/main/java/com/seibel/lod/core/dataObjects/fullData/sources/SingleChunkFullDataSource.java +++ b/core/src/main/java/com/seibel/lod/core/dataObjects/fullData/sources/SingleChunkFullDataSource.java @@ -11,7 +11,7 @@ import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.pos.DhLodPos; import com.seibel.lod.core.pos.DhSectionPos; import com.seibel.lod.core.util.LodUtil; -import com.seibel.lod.core.util.objects.UnclosableInputStream; +import com.seibel.lod.core.util.objects.DhUnclosableInputStream; import org.apache.logging.log4j.Logger; import java.io.*; @@ -180,7 +180,7 @@ public class SingleChunkFullDataSource extends FullArrayView implements IIncompl if (end != 0xFFFFFFFF) throw new IOException("invalid data content end guard"); - FullDataPointIdMap mapping = FullDataPointIdMap.deserialize(new UnclosableInputStream(dos)); + FullDataPointIdMap mapping = FullDataPointIdMap.deserialize(new DhUnclosableInputStream(dos)); end = dos.readInt(); if (end != 0xFFFFFFFF) throw new IOException("invalid id mapping end guard"); diff --git a/core/src/main/java/com/seibel/lod/core/dataObjects/render/ColumnRenderSource.java b/core/src/main/java/com/seibel/lod/core/dataObjects/render/ColumnRenderSource.java index aa1758636..4a0264751 100644 --- a/core/src/main/java/com/seibel/lod/core/dataObjects/render/ColumnRenderSource.java +++ b/core/src/main/java/com/seibel/lod/core/dataObjects/render/ColumnRenderSource.java @@ -202,6 +202,11 @@ public class ColumnRenderSource // data update and output // //========================// + public void saveRender(IDhClientLevel level, RenderMetaDataFile file, OutputStream dataStream) throws IOException + { + DataOutputStream dos = new DataOutputStream(dataStream); // DO NOT CLOSE + this.writeData(dos); + } void writeData(DataOutputStream outputStream) throws IOException { outputStream.writeByte(this.getDataDetail()); @@ -429,12 +434,6 @@ public class ColumnRenderSource return false; } - public void saveRender(IDhClientLevel level, RenderMetaDataFile file, OutputStream dataStream) throws IOException - { - DataOutputStream dos = new DataOutputStream(dataStream); // DO NOT CLOSE - this.writeData(dos); - } - public byte getRenderVersion() { return DATA_FORMAT_VERSION; } /** diff --git a/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataFileHandler.java b/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataFileHandler.java index e4198c72f..692565b19 100644 --- a/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataFileHandler.java +++ b/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataFileHandler.java @@ -427,7 +427,7 @@ public class FullDataFileHandler implements IFullDataSourceProvider IFullDataSource sourceLocal = source; boolean changed = updater.apply(sourceLocal); -// if (changed) +// if (changed) // { // metaData.dataVersion.incrementAndGet(); // } @@ -439,6 +439,7 @@ public class FullDataFileHandler implements IFullDataSourceProvider changed |= newSource != sourceLocal; sourceLocal = newSource; } + if (changed) { onUpdated.accept(sourceLocal); diff --git a/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataMetaFile.java b/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataMetaFile.java index 6d45ffa14..ed230a102 100644 --- a/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataMetaFile.java +++ b/core/src/main/java/com/seibel/lod/core/file/fullDatafile/FullDataMetaFile.java @@ -420,7 +420,7 @@ public class FullDataMetaFile extends AbstractMetaDataContainerFile private FileInputStream getDataContent() throws IOException { FileInputStream fin = new FileInputStream(this.file); - int toSkip = METADATA_SIZE; + int toSkip = METADATA_SIZE_IN_BYTES; while (toSkip > 0) { long skipped = fin.skip(toSkip); diff --git a/core/src/main/java/com/seibel/lod/core/file/metaData/AbstractMetaDataContainerFile.java b/core/src/main/java/com/seibel/lod/core/file/metaData/AbstractMetaDataContainerFile.java index e04d475d7..57f63e285 100644 --- a/core/src/main/java/com/seibel/lod/core/file/metaData/AbstractMetaDataContainerFile.java +++ b/core/src/main/java/com/seibel/lod/core/file/metaData/AbstractMetaDataContainerFile.java @@ -3,7 +3,6 @@ package com.seibel.lod.core.file.metaData; import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.Channels; -import java.nio.channels.ClosedByInterruptException; import java.nio.channels.ClosedChannelException; import java.nio.channels.FileChannel; import java.nio.file.FileAlreadyExistsException; @@ -15,7 +14,7 @@ import java.util.zip.CheckedOutputStream; import com.seibel.lod.core.util.FileUtil; import com.seibel.lod.core.pos.DhSectionPos; -import com.seibel.lod.core.util.objects.UnclosableOutputStream; +import com.seibel.lod.core.util.objects.DhUnclosableOutputStream; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.util.LodUtil; import org.apache.logging.log4j.Logger; @@ -51,7 +50,8 @@ public abstract class AbstractMetaDataContainerFile { private static final Logger LOGGER = DhLoggerBuilder.getLogger(); - public static final int METADATA_SIZE = 64; + public static final int METADATA_SIZE_IN_BYTES = 64; +// public static final int BUFFER_SIZE = 8192; public static final int METADATA_RESERVED_SIZE = 24; /** equivalent to "DHv0" */ public static final int METADATA_IDENTITY_BYTES = 0x44_48_76_30; @@ -119,7 +119,7 @@ public abstract class AbstractMetaDataContainerFile { try (FileChannel channel = FileChannel.open(file.toPath(), StandardOpenOption.READ)) { - ByteBuffer byteBuffer = ByteBuffer.allocate(METADATA_SIZE); + ByteBuffer byteBuffer = ByteBuffer.allocate(METADATA_SIZE_IN_BYTES); channel.read(byteBuffer, 0); channel.close(); byteBuffer.flip(); @@ -203,20 +203,21 @@ public abstract class AbstractMetaDataContainerFile try (FileChannel file = FileChannel.open(tempFile.toPath(), StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { - file.position(METADATA_SIZE); + file.position(METADATA_SIZE_IN_BYTES); int checksum; - try (OutputStream channelOut = new UnclosableOutputStream(Channels.newOutputStream(file)); // Prevent closing the channel + try (OutputStream channelOut = new DhUnclosableOutputStream(Channels.newOutputStream(file)); // Prevent closing the channel BufferedOutputStream bufferedOut = new BufferedOutputStream(channelOut); // TODO: Is default buffer size ok? Do we even need to buffer? CheckedOutputStream checkedOut = new CheckedOutputStream(bufferedOut, new Adler32())) - { + { // TODO: Is Adler32 ok? dataWriterFunc.writeBufferToFile(checkedOut); checksum = (int) checkedOut.getChecksum().getValue(); } + file.position(0); // Write metadata - ByteBuffer buff = ByteBuffer.allocate(METADATA_SIZE); + ByteBuffer buff = ByteBuffer.allocate(METADATA_SIZE_IN_BYTES); buff.putInt(METADATA_IDENTITY_BYTES); buff.putInt(this.pos.sectionX); buff.putInt(Integer.MIN_VALUE); // Unused diff --git a/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaDataFile.java b/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaDataFile.java index f7e8d1596..b4c94d8a1 100644 --- a/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaDataFile.java +++ b/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaDataFile.java @@ -231,7 +231,7 @@ public class RenderMetaDataFile extends AbstractMetaDataContainerFile private FileInputStream getDataContent() throws IOException { FileInputStream fin = new FileInputStream(this.file); - int toSkip = METADATA_SIZE; + int toSkip = METADATA_SIZE_IN_BYTES; while (toSkip > 0) { long skipped = fin.skip(toSkip); diff --git a/core/src/main/java/com/seibel/lod/core/util/objects/UnclosableInputStream.java b/core/src/main/java/com/seibel/lod/core/util/objects/DhUnclosableInputStream.java similarity index 67% rename from core/src/main/java/com/seibel/lod/core/util/objects/UnclosableInputStream.java rename to core/src/main/java/com/seibel/lod/core/util/objects/DhUnclosableInputStream.java index 3a4860be7..ec1485602 100644 --- a/core/src/main/java/com/seibel/lod/core/util/objects/UnclosableInputStream.java +++ b/core/src/main/java/com/seibel/lod/core/util/objects/DhUnclosableInputStream.java @@ -4,8 +4,8 @@ import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; -public class UnclosableInputStream extends FilterInputStream { - public UnclosableInputStream(InputStream it) { +public class DhUnclosableInputStream extends FilterInputStream { + public DhUnclosableInputStream(InputStream it) { super(it); } diff --git a/core/src/main/java/com/seibel/lod/core/util/objects/UnclosableOutputStream.java b/core/src/main/java/com/seibel/lod/core/util/objects/DhUnclosableOutputStream.java similarity index 64% rename from core/src/main/java/com/seibel/lod/core/util/objects/UnclosableOutputStream.java rename to core/src/main/java/com/seibel/lod/core/util/objects/DhUnclosableOutputStream.java index 676f85507..c9d2440f8 100644 --- a/core/src/main/java/com/seibel/lod/core/util/objects/UnclosableOutputStream.java +++ b/core/src/main/java/com/seibel/lod/core/util/objects/DhUnclosableOutputStream.java @@ -4,8 +4,8 @@ import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; -public class UnclosableOutputStream extends FilterOutputStream { - public UnclosableOutputStream(OutputStream it) { +public class DhUnclosableOutputStream extends FilterOutputStream { + public DhUnclosableOutputStream(OutputStream it) { super(it); } @Override