package com.github.czyzby.lml.uedi.assets.impl;
import java.lang.reflect.Member;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.utils.ObjectMap;
import com.github.czyzby.kiwi.util.common.Strings;
import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps;
import com.github.czyzby.lml.uedi.assets.Loaded;
import com.github.czyzby.uedi.reflection.impl.FieldMember;
/** Loads assets immediately. Caches for further reuse.
*
* @author MJ
*
* @param <Asset> type of loaded assets. */
public abstract class AbstractEagerAssetProvider<Asset> extends AbstractAssetProvider<Asset> {
private final ObjectMap<String, Asset> idsToAssets = GdxMaps.newObjectMap();
public AbstractEagerAssetProvider(final InjectingAssetManager assetManager) {
super(assetManager);
}
@Override
public Asset provide(final Object target, final Member member) {
if (member == null) {
throwUnknownPathException();
}
final String id = member.getName();
if (Strings.isEmpty(id)) {
throwUnknownPathException();
}
final Asset asset = getOrLoad(id);
if (member instanceof FieldMember && target instanceof Loaded) {
((Loaded) target).onLoad(determinePath(id), getType(), asset);
}
return asset;
}
@Override
public Asset getOrLoad(final String id) {
if (idsToAssets.containsKey(id)) {
return idsToAssets.get(id);
}
final Asset asset = load(id, determinePath(id), getAssetManager());
idsToAssets.put(id, asset);
return asset;
}
/** @param id ID of the asset.
* @param path determined asset path.
* @param assetManager asset manager, which should include the asset.
* @return loaded asset instance. */
protected abstract Asset load(String id, String path, AssetManager assetManager);
}