package rescuecore2.worldmodel; import java.util.Set; import java.util.HashSet; import java.util.Map; import java.util.HashMap; import java.util.Collection; import java.util.Collections; import java.util.Iterator; /** Default implementation of a WorldModel. @param <T> The subclass of Entity that this world model holds. */ public class DefaultWorldModel<T extends Entity> extends AbstractWorldModel<T> { private Map<EntityID, T> entities; /** Construct an empty world model. @param clazz The class of objects that are allowed in this world model. This approach is a workaround for the limitations of Java generics. */ public DefaultWorldModel(Class<? extends T> clazz) { entities = new HashMap<EntityID, T>(); registerAllowedClass(clazz); } /** Construct an empty world model. @return A new DefaultWorldModel that accepts any type of Entity. */ public static DefaultWorldModel<Entity> create() { return new DefaultWorldModel<Entity>(Entity.class); } @Override public final Collection<T> getAllEntities() { return Collections.unmodifiableCollection(entities.values()); } @Override public final void addEntityImpl(T e) { entities.put(e.getID(), e); fireEntityAdded(e); } @Override public final void removeEntity(EntityID id) { T removed = entities.remove(id); if (removed != null) { fireEntityRemoved(removed); } } @Override public final void removeAllEntities() { Set<T> all = new HashSet<T>(entities.values()); entities.clear(); for (T next : all) { fireEntityRemoved(next); } } @Override public final T getEntity(EntityID id) { return entities.get(id); } @Override public final Iterator<T> iterator() { return entities.values().iterator(); } }