package speiger.src.coreengine.assets; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; 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(); File file; public AssetManager(File file) { this.file = file; } public File getMainAsset() { return file; } @Override public void reload() { domains.clear(); loadAssetPackage(file); } public void loadAssetPackage(File file) { if(file.isDirectory()) { loadAssets(new FolderAssetPackage(file)); } else if(isZipFile(file)) { loadAssets(new ZipAssetPackage(file)); } } 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("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()])); } } }