remove AbstractRenderSourceLoader

There was only one type of RenderSource so it didn't make sense to keep it
This commit is contained in:
James Seibel
2023-02-18 16:46:17 -06:00
parent 40db02cce3
commit 6ac762d415
6 changed files with 20 additions and 142 deletions
@@ -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
@@ -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. <br><Br>
*
* 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<Class<? extends ColumnRenderSource>, AbstractRenderSourceLoader> LOADER_BY_SOURCE_TYPE = HashMultimap.create();
public static final HashMap<Long, Class<? extends ColumnRenderSource>> 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<AbstractRenderSourceLoader> 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);
}
@@ -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
@@ -20,9 +20,9 @@ public class DataRenderTransformer
return CompletableFuture.supplyAsync(() -> transform(data, level), TRANSFORMER_THREADS);
}
public static CompletableFuture<ColumnRenderSource> asyncTransformDataSource(CompletableFuture<IFullDataSource> data, IDhClientLevel level)
public static CompletableFuture<ColumnRenderSource> asyncTransformDataSource(CompletableFuture<IFullDataSource> 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);
}
}
@@ -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;
@@ -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<LodRenderSource>, or - File that may still be loaded
// CompletableFuture<LodRenderSource>,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)