package com.github.czyzby.lml.uedi.i18n.impl; import java.util.Locale; import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader; import com.badlogic.gdx.assets.loaders.FileHandleResolver; import com.badlogic.gdx.assets.loaders.I18NBundleLoader; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.I18NBundle; import com.badlogic.gdx.utils.ObjectMap; import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; /** Allows to eagerly load {@link I18NBundle} instances. Thread-safe and prepared to load multiple bundles at once, * contrary to the default loader. * * @author MJ * @see com.badlogic.gdx.assets.loaders.I18NBundleLoader */ public class EagerI18NBundleLoader extends AsynchronousAssetLoader<I18NBundle, I18NBundleLoader.I18NBundleParameter> { private final ObjectMap<String, I18NBundle> bundles = GdxMaps.newObjectMap(); /** @param resolver will be used to load bundle files. */ public EagerI18NBundleLoader(final FileHandleResolver resolver) { super(resolver); } @Override public void loadAsync(final AssetManager manager, final String fileName, final FileHandle file, final I18NBundleLoader.I18NBundleParameter parameter) { I18NBundle bundle; if (parameter instanceof EagerI18NBundleParameter && ((EagerI18NBundleParameter) parameter).bundle != null) { return; } else if (parameter.encoding == null) { bundle = I18NBundle.createBundle(file, parameter.locale); } else { bundle = I18NBundle.createBundle(file, parameter.locale, parameter.encoding); } synchronized (bundles) { bundles.put(fileName, bundle); } } @Override public I18NBundle loadSync(final AssetManager manager, final String fileName, final FileHandle file, final I18NBundleLoader.I18NBundleParameter parameter) { if (parameter instanceof EagerI18NBundleParameter && ((EagerI18NBundleParameter) parameter).bundle != null) { return ((EagerI18NBundleParameter) parameter).bundle; } final I18NBundle bundle; synchronized (bundles) { bundle = bundles.remove(fileName); } return bundle; } @Override @SuppressWarnings("rawtypes") // Raw types due to ugly API. public Array<AssetDescriptor> getDependencies(final String fileName, final FileHandle file, final I18NBundleLoader.I18NBundleParameter parameter) { return null; } /** See {@link com.badlogic.gdx.assets.loaders.I18NBundleLoader.I18NBundleParameter}. * * @author davebaol * @author MJ */ public static class EagerI18NBundleParameter extends com.badlogic.gdx.assets.loaders.I18NBundleLoader.I18NBundleParameter { private final I18NBundle bundle; /** Loads the bundle with default locale and encoding. */ public EagerI18NBundleParameter() { this(null, null); } /** @param locale determines bundle locale. */ public EagerI18NBundleParameter(final Locale locale) { this(locale, null); } /** @param locale determines bundle locale. * @param encoding determines how files are loaded. */ public EagerI18NBundleParameter(final Locale locale, final String encoding) { this(locale == null ? Locale.getDefault() : locale, encoding, null); } /** @param bundle eagerly loaded. Will be immediately returned by the loader. Allows to have a managed bundle * without actually loading it asynchronously with an asset manager. */ public EagerI18NBundleParameter(final I18NBundle bundle) { this(null, null, bundle); } private EagerI18NBundleParameter(final Locale locale, final String encoding, final I18NBundle bundle) { super(locale, encoding); this.bundle = bundle; } } }