package org.andengine.util.level;
import java.util.HashMap;
import org.andengine.entity.IEntity;
import org.andengine.util.adt.list.SmartList;
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 class LevelParser extends DefaultHandler {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private final IEntityLoader mDefaultEntityLoader;
private final HashMap<String, IEntityLoader> mEntityLoaders;
private SmartList<IEntity> mParentEntityStack = new SmartList<IEntity>();
// ===========================================================
// Constructors
// ===========================================================
public LevelParser(final IEntityLoader pDefaultEntityLoader, final HashMap<String, IEntityLoader> pEntityLoaders) {
this.mDefaultEntityLoader = pDefaultEntityLoader;
this.mEntityLoaders = pEntityLoaders;
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
public void startElement(final String pUri, final String pLocalName, final String pQualifiedName, final Attributes pAttributes) throws SAXException {
final String entityName = pLocalName;
final IEntity parent = (this.mParentEntityStack.isEmpty()) ? null : this.mParentEntityStack.getLast();
final IEntityLoader entityLoader = this.mEntityLoaders.get(entityName);
final IEntity entity;
if(entityLoader != null) {
entity = entityLoader.onLoadEntity(entityName, pAttributes);
} else if(this.mDefaultEntityLoader != null) {
entity = this.mDefaultEntityLoader.onLoadEntity(entityName, pAttributes);
} else {
throw new IllegalArgumentException("Unexpected tag: '" + entityName + "'.");
}
if(parent != null && entity != null) {
parent.attachChild(entity);
}
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
// ===========================================================
}