package org.geotiff.image;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
/**
* The <code>KeyMap</code> represents the two-way mapping between a single set
* of GeoTIFF codes and their symbolic string names. The
* <code>KeyRegistry</code> keeps track of all of these.
*
* @see KeyRegistry
*/
public class KeyMap extends Properties {
// private String name;
private HashMap inverse = new HashMap();
/** Empty Constructor for serialization */
public KeyMap() {
super();
}
/** Constructor for named resource file */
public KeyMap(String resourceName) throws IOException {
super();
InputStream propfile = getClass().getClassLoader().getResourceAsStream(resourceName);
if (propfile == null) {
throw new IOException("Resource not found");
}
load(propfile);
// Construct the inverse of the table
Iterator iter = entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
try {
inverse.put(entry.getValue(), entry.getKey());
} catch (Exception e) {
// okay to fail for repeated.
}
}
}
/**
* Gets property from key; if value starts with a $ it is an alias to
* another property. The method is non-recursive, and only follows one level
* of indirection.
*
* @param key the symbolic key to resolve
*/
public String getProperty2(String key) {
String val = getProperty(key);
if (val == null)
return val;
if (val.startsWith("$")) {
val = getProperty(val.substring(1));
}
return val;
}
/**
* Gets integer code from named key
*
* @param key the symbolic key to resolve
*/
int getCode(String key) {
if (key == null)
return -1;
String sval = getProperty2(key);
if (sval == null)
return -1;
else
return Integer.parseInt(sval.trim());
}
/**
* Gets primary string key from code value.
*
* @param code the numeric code to lookup.
*/
String getKey(int code) {
return (String) inverse.get((new Integer(code)).toString());
}
}