package edu.gatech.cs2335.lemmings.graphics; import java.util.Map; import java.util.HashMap; import java.util.Properties; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /** * Class TileSetManager: This guy will allow us to manage tilesets in * such a fashion that every tileset is only loaded once. * *
 * Revision History:
 *     v1.0 (Mar. 12, 2004) - Created the TileSetManager class
 * 
* * @author Vladimir Urazov * @version Version 1.0, Mar. 12, 2004 */ public class TileSetManager { /** * Show debug output? */ private static final boolean VERBOSE = false; /** * The name of the file, where the mappings between the resource * names and their paths reside. */ public static final String RESOURCE_MAP_FILE = "resources.txt"; /** * Singleton implementation. */ private static TileSetManager instance; /** * This map will contain the tilesets currently loaded. */ private Map tileSets; /** * This contains the mappings between the paths and the ids of the * resources. */ private Map paths; /** * Creates a new TileSetManager instance. Since this * class is a songleton, there is no need for the constructor to be * public. */ private TileSetManager() { tileSets = new HashMap(); paths = new HashMap(); loadPaths(); } /** * Singleton Implementation. * * @return a TileSetManager value */ public static synchronized TileSetManager getInstance() { if (instance == null) { instance = new TileSetManager(); } return instance; } /** * This function will load the mapping between the paths and ids of * the resources. */ private void loadPaths() { FileInputStream fis = null; Properties props = null; paths.clear(); //Open up the resource properties file: try { fis = new FileInputStream(RESOURCE_MAP_FILE); } catch (IOException ioe) { System.err.println("TileSetManager: Could not open settings file..."); System.err.println("\tIOException: " + ioe.getMessage()); System.err.flush(); return; } try { props = new Properties(); props.load(fis); } catch (IOException ioe) { System.err.println("TileSetManager: Could not " + "read the properties file..."); System.err.println("\tIOException: " + ioe.getMessage()); System.err.flush(); return; } if (VERBOSE) { System.out.println("TileSetManager: Loaded the following properties"); System.out.println(props); System.out.flush(); } paths.putAll(props); } /** * Loads the resource if needed. * * @param name a String value * @param path a String value * @return a boolean value */ public boolean loadResource(String name, String path) { String newName = name; String p = path; if (newName == null) { //Check if the path is valid: if (p == null) { return false; } File f = new File(p); if (!f.exists()) { return false; } newName = f.getName(); //Check if a resource with the same name already exists: if (this.paths.containsKey(newName)) { return false; } //If we are still here, need to add the new entry to the paths: this.paths.put(newName, f.getPath()); p = (String) this.paths.get(newName); } else { if (this.paths.containsKey(newName)) { if (p != null) { //Need to update the entry in the table: File f = new File(p); if (!f.exists()) { return false; } this.paths.remove(newName); this.paths.put(newName, f.getPath()); //Need to also check if we have already loaded the item into //the table: if (this.tileSets.containsKey(newName)) { this.tileSets.remove(newName); } p = (String) this.paths.get(newName); } else { p = "images/" + (String) this.paths.get(newName); this.paths.put(name, p); } } else { if (p == null) { return false; } else { File f = new File(p); if (!f.exists()) { return false; } this.paths.put(newName, f.getPath()); p = (String) this.paths.get(newName); } } } //If we are still here, the paths and everything are good. Time to //actually load the resource: TileSet set = new ImprovedTileSet(); if (!set.loadTileset(p)) { return false; } this.tileSets.put(newName, set); return true; } /** * Returns true if the tileset is loaded and false if it is not. * * @param name a String value * @return a boolean value */ public boolean tileSetLoaded(String name) { return this.tileSets.containsKey(name); } /** * Returns the tileset with the specified name. Loads it if necessary. * * @param name a String value * @return a TileSet value */ public TileSet getTileSet(String name) { if (!tileSetLoaded(name)) { if (!loadResource(name, null)) { return null; } } return (TileSet) this.tileSets.get(name); } }