package speiger.src.coreengine.assets; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.Set; import java.util.zip.ZipFile; import speiger.src.collections.objects.lists.ObjectArrayList; import speiger.src.collections.objects.maps.impl.hash.Object2ObjectLinkedOpenHashMap; import speiger.src.coreengine.assets.impl.FolderAssetPackage; import speiger.src.coreengine.assets.impl.ZipAssetPackage; import speiger.src.coreengine.assets.reloader.IReloadableResource; public class AssetManager implements IReloadableResource { Map domains = new Object2ObjectLinkedOpenHashMap<>(); Path path; public AssetManager(File file) { this(file.toPath()); } public AssetManager(Path path) { this.path = path; } public Path getMainAsset() { return path; } @Override public void reload() { domains.clear(); loadAssetPackage(path); } public void loadAssetPackage(File file) { loadAssetPackage(file.toPath()); } public void loadAssetPackage(Path path) { if(Files.notExists(path)) return; if(Files.isDirectory(path)) loadAssets(new FolderAssetPackage(path)); else if(isZipFile(path)) loadAssets(new ZipAssetPackage(path)); } public void loadAssets(IAssetPackage packages) { for(String s : packages.getDomains()) { DomainAssets entry = domains.get(s); if(entry == null) { entry = new DomainAssets(); domains.put(s, entry); } entry.addAssets(packages); } } public Set getDomains() { return domains.keySet(); } public IAsset getAsset(AssetLocation location) throws IOException { DomainAssets asset = domains.get(location.getDomain()); if(asset == null) { throw new FileNotFoundException("Domain & File["+location.toString()+"] not found"); } return asset.getAsset(location); } public MultiAsset getAssets(AssetLocation...locations) { IAsset[] asset = new IAsset[locations.length]; for(int i = 0,m=locations.length;i packages = new ObjectArrayList(); public void addAssets(IAssetPackage assets) { packages.add(assets); } public IAsset getAsset(AssetLocation location) throws IOException { for(int i = packages.size() - 1;i>=0;i--) { IAsset asset = packages.get(i).getAsset(location); if(asset != null) return asset; } throw new FileNotFoundException("File["+location.toString()+"] not found"); } public MultiAsset getMultiAsset(AssetLocation location, AssetLocation... subLocations) { for(int i = packages.size() - 1;i>=0;i--) { IAssetPackage entry = packages.get(i); IAsset asset = entry.getAsset(location); if(asset != null) { IAsset[] result = new IAsset[1 + subLocations.length]; result[0] = asset; for(int x = 0;x assets = new ObjectArrayList(); for(IAssetPackage entry : packages) { IAsset asset = entry.getAsset(location); if(asset != null) assets.add(asset); } if(assets.isEmpty()) { throw new FileNotFoundException("File["+location.toString()+"] not found"); } return new MultiAsset(assets.toArray(new IAsset[assets.size()])); } } }