import java.lang.*;
import java.util.*;
import java.io.*;

class Configuration {

private static Configuration instance_ = null;
private static String FILE = "config.ini";

private Properties properties_;
public Properties properties() { return properties_; }
public void properties (Properties theProp) { properties_ = theProp; }

private Configuration() {
this.initialize();
}

public synchronized static Configuration instance() {
if (instance_ == null)
instance_ = new Configuration();
return instance_;
}

private void initialize() {
this.properties (new Properties());
this.load();
this.display();
}

public String valueOf(String aKey) {
String answer = this.properties().getProperty(aKey);
if (answer == null) {
System.out.println ("Config data " + aKey + " not found");
}
return answer;
}

public void load() {
try {
DataInputStream theStreamIn = new DataInputStream (
new FileInputStream (Configuration.FILE));
this.properties().load(theStreamIn);
}
catch (IOException e) {
System.out.println("INI FileIn Error, reloading defaults");
this.writeDefaults();
}
}

public void writeDefaults() {

Properties theSettings = this.properties();
theSettings.put("HEIGHT", "128");
theSettings.put("WIDTH", "128");
theSettings.put("CANVASHEIGHT", "600");
theSettings.put("CANVASWIDTH", "600");
theSettings.put("DEBUG", "on");

try {
PrintStream theStreamOut = new PrintStream (
new FileOutputStream (Configuration.FILE));
theSettings.save(theStreamOut, "GridTest Environment Settings");
}
catch (IOException e) { System.out.println("INI FileOut Error"); }

}

public void display() {
Enumeration theOC = this.properties().propertyNames();
while (theOC.hasMoreElements()) {
String key = (String) theOC.nextElement();
System.out.println (key + " value is " +
this.properties().getProperty(key));
}
}

}