From 6ac762d41555a89b105aecff92a473fcbe5aec39 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 18 Feb 2023 16:46:17 -0600 Subject: [PATCH] remove AbstractRenderSourceLoader There was only one type of RenderSource so it didn't make sense to keep it --- .../java/com/seibel/lod/core/Initializer.java | 9 +- .../render/AbstractRenderSourceLoader.java | 107 ------------------ .../datatype/render/ColumnRenderLoader.java | 11 +- .../transform/DataRenderTransformer.java | 7 +- .../lod/core/file/metaData/MetaData.java | 6 +- .../file/renderfile/RenderMetaDataFile.java | 22 ++-- 6 files changed, 20 insertions(+), 142 deletions(-) delete mode 100644 core/src/main/java/com/seibel/lod/core/datatype/render/AbstractRenderSourceLoader.java 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 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 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 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 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)