package org.andengine.util.level; import java.io.IOException; import java.util.HashMap; import org.andengine.BuildConfig; import org.andengine.entity.IEntity; import org.andengine.util.adt.list.SmartList; import org.andengine.util.debug.Debug; import org.andengine.util.level.exception.LevelLoaderException; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:35:32 - 11.10.2010 */ public abstract class LevelLoaderContentHandler<T extends IEntityLoaderData, L extends IEntityLoaderListener, R extends ILevelLoaderResult> extends DefaultHandler { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== protected final IEntityLoader<T> mDefaultEntityLoader; protected final HashMap<String, IEntityLoader<T>> mEntityLoaders; protected final T mEntityLoaderData; private final SmartList<IEntity> mParentEntityStack = new SmartList<IEntity>(); protected IEntity mRootEntity; protected L mEntityLoaderListener; // =========================================================== // Constructors // =========================================================== public LevelLoaderContentHandler(final IEntityLoader<T> pDefaultEntityLoader, final HashMap<String, IEntityLoader<T>> pEntityLoaders, final T pEntityLoaderData) { this(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderData, null); } public LevelLoaderContentHandler(final IEntityLoader<T> pDefaultEntityLoader, final HashMap<String, IEntityLoader<T>> pEntityLoaders, final T pEntityLoaderData, final L pEntityLoaderListener) { this.mDefaultEntityLoader = pDefaultEntityLoader; this.mEntityLoaders = pEntityLoaders; this.mEntityLoaderData = pEntityLoaderData; this.mEntityLoaderListener = pEntityLoaderListener; } // =========================================================== // Getter & Setter // =========================================================== public abstract R getLevelLoaderResult(); // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public void startElement(final String pUri, final String pLocalName, final String pQualifiedName, final Attributes pAttributes) throws SAXException, LevelLoaderException { final String entityName = pLocalName; final IEntity parent = (this.mParentEntityStack.isEmpty()) ? null : this.mParentEntityStack.getLast(); IEntityLoader<T> entityLoader = this.mEntityLoaders.get(entityName); if (entityLoader == null) { if (this.mDefaultEntityLoader == null) { throw new LevelLoaderException("Unexpected tag: '" + entityName + "'."); } else { entityLoader = this.mDefaultEntityLoader; } } final IEntity entity; try { entity = entityLoader.onLoadEntity(entityName, parent, pAttributes, this.mEntityLoaderData); } catch (final IOException e) { throw new LevelLoaderException("Exception when loading entity: '" + entityName + "'.", e); } if (entity == null) { if (BuildConfig.DEBUG) { Debug.w("No '" + IEntity.class.getSimpleName() + "' created for entity name: '" + entityName + "'."); } } else { if (parent == null) { if (this.mRootEntity == null) { this.mRootEntity = entity; } } else { parent.attachChild(entity); } if (this.mEntityLoaderListener != null) { this.mEntityLoaderListener.onEntityLoaded(entity, pAttributes); } } this.mParentEntityStack.addLast(entity); } @Override public void endElement(final String pUri, final String pLocalName, final String pQualifiedName) throws SAXException { this.mParentEntityStack.removeLast(); } // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== }