package org.terasology.entitySystem.pojo; import com.google.common.collect.Maps; import org.terasology.entitySystem.Component; import org.terasology.entitySystem.Prefab; import org.terasology.entitySystem.PrefabManager; import org.terasology.entitySystem.metadata.ComponentLibrary; import java.util.*; /** * @author Immortius <immortius@gmail.com> */ public class PojoPrefabManager implements PrefabManager { protected final static String OBSERVER_EVENT_DESTROYED = "destroyed"; protected final static String OBSERVER_EVENT_RENAMED = "rename"; ComponentLibrary componentLibrary; Map<String, Prefab> prefabTable = Maps.newHashMap(); public PojoPrefabManager(ComponentLibrary componentLibrary) { this.componentLibrary = componentLibrary; } public Prefab createPrefab(String name) { String normalisedName = normalizeName(name); if (exists(normalisedName)) { return getPrefab(normalisedName); } return this.registerPrefab(new PojoPrefab(name, componentLibrary)); } public Prefab getPrefab(String name) { String normalisedName = normalizeName(name); return exists(normalisedName) ? prefabTable.get(normalisedName) : null; } public boolean exists(String name) { String normalisedName = normalizeName(name); return prefabTable.containsKey(normalisedName); } public Prefab registerPrefab(Prefab prefab) { String normalisedName = normalizeName(prefab.getName()); if (prefabTable.containsKey(normalisedName)) { throw new IllegalArgumentException("Prefab '" + prefab.getName() + "' already registered!"); } prefabTable.put(normalisedName, prefab); return prefab; } public Iterable<Prefab> listPrefabs() { return Collections.unmodifiableCollection(prefabTable.values()); } public void removePrefab(String name) { String normalisedName = normalizeName(name); prefabTable.remove(normalisedName); } public <T extends Component> T getComponent(String name, Class<T> componentClass) { if (!exists(name)) { return null; } String normalisedName = normalizeName(name); return getPrefab(normalisedName).getComponent(componentClass); } public <T extends Component> T setComponent(String name, T component) { if (!exists(name)) { throw new IllegalArgumentException("No prefab exists with name: " + name); } String normalisedName = normalizeName(name); return getPrefab(normalisedName).setComponent(component); } public <T extends Component> void removeComponent(String name, Class<T> componentClass) { if (!exists(name)) { throw new IllegalArgumentException("No prefab exists with name: " + name); } String normalisedName = normalizeName(name); getPrefab(normalisedName).removeComponent(componentClass); } protected class PrefabObserver implements Observer { public void update(Observable o, Object arg) { //To change body of implemented methods use File | Settings | File Templates. } } private String normalizeName(String name) { return name.toLowerCase(Locale.ENGLISH); } }