package ttt.organization.managers;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import ttt.TTT_Constants;
import ttt.io.XMLSerializeable;
import ttt.organization.TTT_Entity;
import nu.xom.Element;
import nu.xom.Elements;
public class TTT_EntityManager implements XMLSerializeable {
private final HashMap<String, List<TTT_Entity>> entitiesByType;
private final List<TTT_Entity> entities;
private final HashMap<String, TTT_Entity> idMap;
public TTT_EntityManager() {
entitiesByType = new HashMap<String, List<TTT_Entity>>();
entities = new LinkedList<TTT_Entity>();
idMap = new HashMap<String, TTT_Entity>();
}
public void addEntity(final TTT_Entity entity) {
for (String type : entity.types.getTypeList()) {
if (!entitiesByType.containsKey(type)) {
entitiesByType.put(type, new LinkedList<TTT_Entity>());
}
entitiesByType.get(type).add(entity);
}
entities.add(entity);
if (entity.variables.has(TTT_Constants.ID_KEY)) {
idMap.put(entity.variables.loadString(TTT_Constants.ID_KEY), entity);
}
}
public void removeEntity(final TTT_Entity entity) {
for (String type : entity.types.getTypeList()) {
if (entitiesByType.containsKey(type)) {
entitiesByType.get(type).remove(entity);
}
}
entities.remove(entity);
if (entity.variables.has(TTT_Constants.ID_KEY)) {
idMap.remove(entity.variables.loadString(TTT_Constants.ID_KEY));
}
}
public List<TTT_Entity> getEntitiesByType(final String... types) {
List<TTT_Entity> en = new LinkedList<TTT_Entity>();
for (String type : types) {
if (entitiesByType.containsKey(type)) {
en.addAll(entitiesByType.get(type));
}
}
return en;
}
public TTT_Entity getEntityById(final String id) {
return idMap.get(id);
}
/**
* Return a shallow copy of the list of entities.
*
* @return shallow list copy
*/
public List<TTT_Entity> getAllEntities() {
return new LinkedList<TTT_Entity>(entities);
}
public List<TTT_Entity> getAllEntitiesFast() {
return entities;
}
private void clearAllEntities() {
entities.clear();
entitiesByType.clear();
idMap.clear();
}
@Override
public Element writeToElement() {
Element ele = new Element(getElementName());
for (TTT_Entity ent : entities) {
ele.appendChild(ent.writeToElement());
}
return ele;
}
@Override
public void assembleFromElement(Element entity) {
clearAllEntities();
Elements ents = entity.getChildElements();
for (int i = 0; i < entity.getChildCount(); i++) {
TTT_Entity e = new TTT_Entity();
e.assembleFromElement(ents.get(i));
addEntity(e);
}
}
@Override
public String getElementName() {
return "entities";
}
public String toString() {
return getElementName();
}
}