diff --git a/core/src/main/java/com/seibel/lod/core/Initializer.java b/core/src/main/java/com/seibel/lod/core/Initializer.java
index bb9f381bd..eec0b4abe 100644
--- a/core/src/main/java/com/seibel/lod/core/Initializer.java
+++ b/core/src/main/java/com/seibel/lod/core/Initializer.java
@@ -2,7 +2,6 @@ package com.seibel.lod.core;
import com.seibel.lod.core.api.external.methods.config.DhApiConfig;
import com.seibel.lod.core.api.external.methods.data.DhApiTerrainDataRepo;
-import com.seibel.lod.core.datatype.render.ColumnRenderLoader;
import com.seibel.lod.core.datatype.full.FullDataLoader;
import com.seibel.lod.core.datatype.full.SparseFullDataLoader;
import com.seibel.lod.api.DhApiMain;
@@ -10,17 +9,11 @@ import com.seibel.lod.core.datatype.full.SingleChunkFullDataLoader;
import com.seibel.lod.core.render.DhApiRenderProxy;
import com.seibel.lod.core.world.DhApiWorldProxy;
-/**
- * Handles first time Core setup.
- *
- * @author Leetom
- * @version 2023-2-8
- */
+/** Handles first time Core setup. */
public class Initializer
{
public static void init()
{
- ColumnRenderLoader unused = new ColumnRenderLoader(); // Auto register into the loader system
FullDataLoader unused2 = new FullDataLoader(); // Auto register into the loader system
SparseFullDataLoader unused3 = new SparseFullDataLoader(); // Auto register
SingleChunkFullDataLoader unused4 = new SingleChunkFullDataLoader(); // Auto register
diff --git a/core/src/main/java/com/seibel/lod/core/datatype/render/AbstractRenderSourceLoader.java b/core/src/main/java/com/seibel/lod/core/datatype/render/AbstractRenderSourceLoader.java
deleted file mode 100644
index 4c29ffb41..000000000
--- a/core/src/main/java/com/seibel/lod/core/datatype/render/AbstractRenderSourceLoader.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.seibel.lod.core.datatype.render;
-
-import com.google.common.collect.HashMultimap;
-import com.seibel.lod.core.datatype.full.IFullDataSource;
-import com.seibel.lod.core.level.IDhClientLevel;
-import com.seibel.lod.core.level.IDhLevel;
-import com.seibel.lod.core.file.renderfile.RenderMetaDataFile;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-
-/**
- * Abstract for loading and creating {@link ColumnRenderSource} objects
- * from {@link RenderMetaDataFile}'s and {@link IFullDataSource}'s.
- *
- * Also holds all {@link AbstractRenderSourceLoader}'s
- * that have been created to allow for migrating old render data formats.
- */
-public abstract class AbstractRenderSourceLoader
-{
- public static final HashMultimap, AbstractRenderSourceLoader> LOADER_BY_SOURCE_TYPE = HashMultimap.create();
- public static final HashMap> SOURCE_TYPE_BY_METADATA_VERSION = new HashMap<>();
-
- public static AbstractRenderSourceLoader getLoader(long renderTypeId, byte loaderVersion)
- {
- return LOADER_BY_SOURCE_TYPE.get(SOURCE_TYPE_BY_METADATA_VERSION.get(renderTypeId)).stream()
- .filter(loader -> Arrays.binarySearch(loader.loaderSupportedRenderDataVersions, loaderVersion) >= 0)
- .findFirst().orElse(null);
- }
-
- public static AbstractRenderSourceLoader getLoader(Class extends ColumnRenderSource> clazz, byte loaderVersion)
- {
- return LOADER_BY_SOURCE_TYPE.get(clazz).stream()
- .filter(l -> Arrays.binarySearch(l.loaderSupportedRenderDataVersions, loaderVersion) >= 0)
- .findFirst().orElse(null);
- }
-
-
-
- public final Class extends ColumnRenderSource> renderSourceClass;
- public final long renderTypeId;
- public final byte[] loaderSupportedRenderDataVersions;
- public final byte detailOffset;
-
-
-
- /**
- * Will automatically add the new render source to the
- * {@link AbstractRenderSourceLoader#LOADER_BY_SOURCE_TYPE}
- *
- * @throws IllegalArgumentException if another render source already exists for the given renderTypeId or supported render data versions
- */
- public AbstractRenderSourceLoader(Class extends ColumnRenderSource> renderSourceClass, long renderTypeId, byte[] loaderSupportedRenderDataVersions, byte detailOffset) throws IllegalArgumentException
- {
- this.renderTypeId = renderTypeId;
- this.loaderSupportedRenderDataVersions = loaderSupportedRenderDataVersions;
- Arrays.sort(loaderSupportedRenderDataVersions); // sort to allow fast access
- this.renderSourceClass = renderSourceClass;
- this.detailOffset = detailOffset;
-
-
- // register the loader //
-
- // validate there isn't another loader for the given renderTypeId
- if (SOURCE_TYPE_BY_METADATA_VERSION.containsKey(renderTypeId)
- && SOURCE_TYPE_BY_METADATA_VERSION.get(renderTypeId) != renderSourceClass)
- {
- throw new IllegalArgumentException("Loader for renderTypeId " + renderTypeId + " already registered with different class: "
- + SOURCE_TYPE_BY_METADATA_VERSION.get(renderTypeId) + " != " + renderSourceClass);
- }
- Set loaders = LOADER_BY_SOURCE_TYPE.get(renderSourceClass);
-
- // validate there isn't another loader that supports the same render data version(s)
- boolean loaderAlreadyExistsForDataVersion = loaders.stream().anyMatch(other ->
- {
- for (byte otherVer : other.loaderSupportedRenderDataVersions)
- {
- if (Arrays.binarySearch(loaderSupportedRenderDataVersions, otherVer) >= 0)
- {
- return true;
- }
- }
- return false;
- });
- if (loaderAlreadyExistsForDataVersion)
- {
- throw new IllegalArgumentException("Loader for class " + renderSourceClass + " that supports one of the render data versions in "
- + Arrays.toString(loaderSupportedRenderDataVersions) + " already registered!");
- }
-
- // register the loader
- SOURCE_TYPE_BY_METADATA_VERSION.put(renderTypeId, renderSourceClass);
- LOADER_BY_SOURCE_TYPE.put(renderSourceClass, this);
- }
-
- /**
- * Can return null if the file is out of date.
- *
- * @throws IOException if the file uses a unsupported data version
- * or there was an issue reading the file
- */
- public abstract ColumnRenderSource loadRenderSource(RenderMetaDataFile renderFile, InputStream data, IDhLevel level) throws IOException;
- /** Should not return null */
- public abstract ColumnRenderSource createRenderSource(IFullDataSource dataSource, IDhClientLevel level);
-
-}
diff --git a/core/src/main/java/com/seibel/lod/core/datatype/render/ColumnRenderLoader.java b/core/src/main/java/com/seibel/lod/core/datatype/render/ColumnRenderLoader.java
index d72d77cb8..9c0d54a0f 100644
--- a/core/src/main/java/com/seibel/lod/core/datatype/render/ColumnRenderLoader.java
+++ b/core/src/main/java/com/seibel/lod/core/datatype/render/ColumnRenderLoader.java
@@ -23,20 +23,18 @@ import java.nio.ByteOrder;
* Please see the {@link ColumnRenderLoader#loadRenderSource} method to see what
* file versions this class can handle.
*/
-public class ColumnRenderLoader extends AbstractRenderSourceLoader
+public class ColumnRenderLoader
{
+ public static ColumnRenderLoader INSTANCE = new ColumnRenderLoader();
+
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
- public ColumnRenderLoader()
- {
- super(ColumnRenderSource.class, ColumnRenderSource.TYPE_ID, new byte[]{ ColumnRenderSource.DATA_FORMAT_VERSION }, ColumnRenderSource.SECTION_SIZE_OFFSET);
- }
+ private ColumnRenderLoader() { }
- @Override
public ColumnRenderSource loadRenderSource(RenderMetaDataFile dataFile, InputStream inputStream, IDhLevel level) throws IOException
{
DataInputStream inputDataStream = new DataInputStream(inputStream); // DO NOT CLOSE
@@ -59,7 +57,6 @@ public class ColumnRenderLoader extends AbstractRenderSourceLoader
}
}
- @Override
public ColumnRenderSource createRenderSource(IFullDataSource dataSource, IDhClientLevel level)
{
if (dataSource instanceof FullDataSource) // TODO replace with Java 7 method
diff --git a/core/src/main/java/com/seibel/lod/core/datatype/transform/DataRenderTransformer.java b/core/src/main/java/com/seibel/lod/core/datatype/transform/DataRenderTransformer.java
index d4b018fba..dfb5656e0 100644
--- a/core/src/main/java/com/seibel/lod/core/datatype/transform/DataRenderTransformer.java
+++ b/core/src/main/java/com/seibel/lod/core/datatype/transform/DataRenderTransformer.java
@@ -20,9 +20,9 @@ public class DataRenderTransformer
return CompletableFuture.supplyAsync(() -> transform(data, level), TRANSFORMER_THREADS);
}
- public static CompletableFuture asyncTransformDataSource(CompletableFuture data, IDhClientLevel level)
+ public static CompletableFuture asyncTransformDataSource(CompletableFuture fullDataSourceFuture, IDhClientLevel level)
{
- return data.thenApplyAsync((d) -> transform(d, level), TRANSFORMER_THREADS);
+ return fullDataSourceFuture.thenApplyAsync((fullDataSource) -> transform(fullDataSource, level), TRANSFORMER_THREADS);
}
private static ColumnRenderSource transform(IFullDataSource dataSource, IDhClientLevel level)
@@ -32,8 +32,7 @@ public class DataRenderTransformer
return null;
}
- return ColumnRenderLoader.LOADER_BY_SOURCE_TYPE.get(ColumnRenderSource.class)
- .stream().findFirst().get().createRenderSource(dataSource, level);
+ return ColumnRenderLoader.INSTANCE.createRenderSource(dataSource, level);
}
}
diff --git a/core/src/main/java/com/seibel/lod/core/file/metaData/MetaData.java b/core/src/main/java/com/seibel/lod/core/file/metaData/MetaData.java
index dd7360387..e2661b1c5 100644
--- a/core/src/main/java/com/seibel/lod/core/file/metaData/MetaData.java
+++ b/core/src/main/java/com/seibel/lod/core/file/metaData/MetaData.java
@@ -15,10 +15,14 @@ public class MetaData
public int checksum;
// public AtomicLong dataVersion; // currently broken
public byte dataLevel;
- // Loader stuff
+
+ // Loader stuff //
+ /** indicates what data is held in this file, is generally a hash of the data's name */
public long dataTypeId;
public byte loaderVersion;
+
+
public MetaData(DhSectionPos pos, int checksum, byte dataLevel, long dataTypeId, byte loaderVersion)
{
this.pos = pos;
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 5c1265246..cc45a8dae 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
@@ -2,7 +2,6 @@ package com.seibel.lod.core.file.renderfile;
import com.seibel.lod.core.datatype.render.ColumnRenderLoader;
import com.seibel.lod.core.datatype.render.ColumnRenderSource;
-import com.seibel.lod.core.datatype.render.AbstractRenderSourceLoader;
import com.seibel.lod.core.datatype.full.sources.ChunkSizedFullDataSource;
import com.seibel.lod.core.file.metaData.MetaData;
import com.seibel.lod.core.level.IDhClientLevel;
@@ -25,9 +24,6 @@ public class RenderMetaDataFile extends AbstractMetaDataFile
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
- public AbstractRenderSourceLoader loader;
- public Class extends ColumnRenderSource> dataType;
-
// The '?' type should either be:
// SoftReference, or - File that may still be loaded
// CompletableFuture,or - File that is being loaded
@@ -72,13 +68,6 @@ public class RenderMetaDataFile extends AbstractMetaDataFile
super(path);
this.fileHandler = fileHandler;
LodUtil.assertTrue(this.metaData != null);
- this.loader = AbstractRenderSourceLoader.getLoader(this.metaData.dataTypeId, this.metaData.loaderVersion);
- if (this.loader == null)
- {
- throw new IOException("Invalid file: Data type loader not found: "
- + this.metaData.dataTypeId + "(v" + this.metaData.loaderVersion + ")");
- }
- this.dataType = this.loader.renderSourceClass;
this.doesFileExist = this.path.exists();
}
@@ -207,7 +196,7 @@ public class RenderMetaDataFile extends AbstractMetaDataFile
ColumnRenderSource renderSource;
try (FileInputStream fio = this.getDataContent())
{
- renderSource = this.loader.loadRenderSource(this, fio, level);
+ renderSource = ColumnRenderLoader.INSTANCE.loadRenderSource(this, fio, level);
}
catch (IOException e)
{
@@ -237,9 +226,8 @@ public class RenderMetaDataFile extends AbstractMetaDataFile
private static MetaData makeMetaData(ColumnRenderSource renderSource)
{
- AbstractRenderSourceLoader loader = AbstractRenderSourceLoader.getLoader(renderSource.getClass(), renderSource.getRenderVersion());
return new MetaData(renderSource.getSectionPos(), -1,
- renderSource.getDataDetail(), loader == null ? 0 : loader.renderTypeId, renderSource.getRenderVersion());
+ renderSource.getDataDetail(), RenderSourceFileHandler.RENDER_SOURCE_TYPE_ID, renderSource.getRenderVersion());
}
private FileInputStream getDataContent() throws IOException
@@ -255,11 +243,15 @@ public class RenderMetaDataFile extends AbstractMetaDataFile
}
toSkip -= skipped;
}
+
if (toSkip != 0)
{
throw new IOException("File IO Error: Failed to skip metadata.");
}
- return fin;
+ else
+ {
+ return fin;
+ }
}
public void save(ColumnRenderSource renderSource, IDhClientLevel level)