SimpleJavaEngine/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java

94 lines
2.3 KiB
Java
Raw Normal View History

2021-08-27 06:07:15 +02:00
package speiger.src.coreengine.assets.impl;
import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
2021-08-27 06:07:15 +02:00
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
2021-08-30 17:38:11 +02:00
import java.util.function.Function;
2021-08-27 06:07:15 +02:00
import speiger.src.collections.objects.lists.ObjectArrayList;
2021-08-27 06:07:15 +02:00
import speiger.src.coreengine.assets.AssetLocation;
import speiger.src.coreengine.assets.IAsset;
import speiger.src.coreengine.assets.IAssetPackage;
2021-08-30 17:38:11 +02:00
import speiger.src.coreengine.assets.IAssetParser;
2021-08-27 06:07:15 +02:00
public class ZipAssetPackage implements IAssetPackage
{
Path baseFolder;
2021-08-30 17:38:11 +02:00
Function<Class<?>, IAssetParser<?>> parsers;
FileSystem cache;
2021-08-27 06:07:15 +02:00
AtomicInteger usedReferences = new AtomicInteger();
Runnable referenceCleaner = this::cleanReference;
2021-08-27 06:07:15 +02:00
public ZipAssetPackage(File file)
{
this(file.toPath());
2021-08-27 06:07:15 +02:00
}
public ZipAssetPackage(Path baseFolder)
2021-08-27 06:07:15 +02:00
{
this.baseFolder = baseFolder;
2021-08-27 06:07:15 +02:00
}
2021-08-30 17:38:11 +02:00
@Override
public void setParsers(Function<Class<?>, IAssetParser<?>> parsers)
{
this.parsers = parsers;
}
private void cleanReference()
2021-08-27 06:07:15 +02:00
{
int left = usedReferences.decrementAndGet();
if(left == 0 && cache != null)
{
try { cache.close(); }
2021-08-27 06:07:15 +02:00
catch(Exception e) {e.printStackTrace();}
cache = null;
}
else if(left < 0) usedReferences.set(0);
}
protected FileSystem getReference() throws IOException
{
usedReferences.getAndIncrement();
if(cache == null) cache = FileSystems.newFileSystem(baseFolder, null);
return cache;
2021-08-27 06:07:15 +02:00
}
@Override
public List<String> getDomains()
{
List<String> domains = new ObjectArrayList<>();
try(FileSystem system = FileSystems.newFileSystem(baseFolder, null))
2021-08-27 06:07:15 +02:00
{
try(DirectoryStream<Path> dirs = Files.newDirectoryStream(system.getPath("assets")))
2021-08-27 06:07:15 +02:00
{
for(Path path : dirs)
2021-08-27 06:07:15 +02:00
{
String s = path.getFileName().toString();
domains.add(s.substring(0, s.length()-1));
2021-08-27 06:07:15 +02:00
}
}
catch(Exception e) { e.printStackTrace(); }
2021-08-27 06:07:15 +02:00
}
catch(Exception e) { e.printStackTrace(); }
return domains;
2021-08-27 06:07:15 +02:00
}
@Override
public IAsset getAsset(AssetLocation location)
{
try
{
Path path = getReference().getPath(location.getActualLocation());
2021-08-30 17:38:11 +02:00
return Files.exists(path) ? new ZipAsset(referenceCleaner, location, path, parsers) : null;
2021-08-27 06:07:15 +02:00
}
catch(Exception e) { return null; }
2021-08-27 06:07:15 +02:00
}
}