package org.andengine.util.level;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.andengine.util.StreamUtils;
import org.andengine.util.level.exception.LevelLoaderException;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.content.res.AssetManager;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @param <T>
* @since 14:16:19 - 11.10.2010
*/
public abstract class LevelLoader<T extends IEntityLoaderData, L extends IEntityLoaderListener, R extends ILevelLoaderResult> {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private final HashMap<String, IEntityLoader<T>> mEntityLoaders = new HashMap<String, IEntityLoader<T>>();
private IEntityLoader<T> mDefaultEntityLoader;
// ===========================================================
// Constructors
// ===========================================================
public LevelLoader() {
}
public LevelLoader(final IEntityLoader<T> pDefaultEntityLoader) {
this.mDefaultEntityLoader = pDefaultEntityLoader;
}
// ===========================================================
// Getter & Setter
// ===========================================================
public void setDefaultEntityLoader(final IEntityLoader<T> pDefaultEntityLoader) {
this.mDefaultEntityLoader = pDefaultEntityLoader;
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
protected abstract T onCreateEntityLoaderData();
protected abstract LevelLoaderContentHandler<T, L, R> onCreateLevelLoaderContentHandler(final HashMap<String, IEntityLoader<T>> pEntityLoaders, final IEntityLoader<T> pDefaultEntityLoader, final T pEntityLoaderData, final L pEntityLoaderListener);
public void registerEntityLoader(final IEntityLoader<T> pEntityLoader) {
final String[] entityNames = pEntityLoader.getEntityNames();
for (int i = 0; i < entityNames.length; i++) {
final String entityName = entityNames[i];
this.mEntityLoaders.put(entityName, pEntityLoader);
}
}
public void clearEntityLoaders() {
this.mEntityLoaders.clear();
}
public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath) throws LevelLoaderException {
return this.loadLevelFromAsset(pAssetManager, pAssetPath, (L) null);
}
public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath, final L pEntityLoaderListener) throws LevelLoaderException {
final T entityLoaderData = this.onCreateEntityLoaderData();
return this.loadLevelFromAsset(pAssetManager, pAssetPath, entityLoaderData, pEntityLoaderListener);
}
public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath, final T pEntityLoaderData) throws LevelLoaderException {
return this.loadLevelFromAsset(pAssetManager, pAssetPath, pEntityLoaderData, null);
}
public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath, final T pEntityLoaderData, final L pEntityLoaderListener) throws LevelLoaderException {
try {
return this.loadLevelFromStream(pAssetManager.open(pAssetPath), pEntityLoaderData, pEntityLoaderListener);
} catch (final IOException e) {
throw new LevelLoaderException(e);
}
}
public R loadLevelFromStream(final InputStream pInputStream) throws LevelLoaderException {
return this.loadLevelFromStream(pInputStream, null);
}
public R loadLevelFromStream(final InputStream pInputStream, final L pEntityLoaderListener) throws LevelLoaderException {
final T entityLoaderData = this.onCreateEntityLoaderData();
return this.loadLevelFromStream(pInputStream, entityLoaderData, pEntityLoaderListener);
}
public R loadLevelFromStream(final InputStream pInputStream, final T pEntityLoaderData, final L pEntityLoaderListener) throws LevelLoaderException {
try {
final SAXParserFactory spf = SAXParserFactory.newInstance();
final SAXParser sp = spf.newSAXParser();
final XMLReader xr = sp.getXMLReader();
final LevelLoaderContentHandler<T, L, R> levelContentHandler = this.onCreateLevelLoaderContentHandler(this.mEntityLoaders, this.mDefaultEntityLoader, pEntityLoaderData, pEntityLoaderListener);
xr.setContentHandler(levelContentHandler);
xr.parse(new InputSource(new BufferedInputStream(pInputStream)));
return levelContentHandler.getLevelLoaderResult();
} catch (final Exception e) {
throw new LevelLoaderException(e);
} finally {
StreamUtils.close(pInputStream);
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}