remove AbstractRenderSourceLoader
There was only one type of RenderSource so it didn't make sense to keep it
This commit is contained in:
@@ -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
|
||||
|
||||
-107
@@ -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
|
||||
|
||||
+3
-4
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user