//import edu.toronto.psi.vincent.util.*;
import java.io.*;

/**
 * Sample code for using the EasyProperties class to read data from
 * and write data to a properties file.
 *
 * <pre>
 * Copyright (C) 2005  Vincent Cheung (vincent@psi.toronto.edu, http://www.psi.toronto.edu/~vincent/)
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.</pre>
 * 
 * @author <a href="mailto:vincent@psi.toronto.edu">Vincent Cheung</a>
 * @version 1.2 12/02/05
 */
public class EasyPropertiesExample {
	public static void main(String[] args) {
		
		String filename = "SampleProperties.txt";
		
		EasyProperties prop = new EasyProperties(filename);

		// show all the properties
		prop.list();
		System.out.println();
		
		
		// read each property in the file in its proper format and display them
		System.out.println("-- get the properties in the proper data type --");
		
		// typical values
		System.out.println("booleanVal1: " + prop.getBooleanProperty("booleanVal1"));
		System.out.println("booleanVal2: " + prop.getBooleanProperty("booleanVal2"));
		System.out.println("integerVal: " + prop.getIntProperty("intVal"));
		System.out.println("doubleVal: " + prop.getDoubleProperty("doubleVal"));
		System.out.println("stringVal: " + prop.getProperty("stringVal"));
		
		System.out.println();
		
		
		// arrays
		
		int[] a;
		int[][] b;
		int[][][] c;
		
		double[] d;
		double[][] e;
		double[][][] f;
		
		String[] g;
		
		System.out.println("intArray1:");
		a = prop.getIntArrayProperty("intArray1");
		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
		System.out.println("\n");
		
		System.out.println("intArray2:");
		a = prop.getIntArrayProperty("intArray2");
		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
		System.out.println("\n");
		
		System.out.println("intArray3:");
		a = prop.getIntArrayProperty("intArray3");
		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
		System.out.println("\n");
		
		System.out.println("int2DArray1:");
		b = prop.get2DIntArrayProperty("int2DArray1");
		for (int i = 0;  i < b.length; i++) {
			for (int j = 0; j < b[i].length; j++) {
				System.out.print(b[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println();
		
		System.out.println("int2DArray2:");
		b = prop.get2DIntArrayProperty("int2DArray2");
		for (int i = 0;  i < b.length; i++) {
			for (int j = 0; j < b[i].length; j++) {
				System.out.print(b[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println();
		
		System.out.println("int2DArray3:");
		b = prop.get2DIntArrayProperty("int2DArray3");
		for (int i = 0;  i < b.length; i++) {
			for (int j = 0; j < b[i].length; j++) {
				System.out.print(b[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println();
		
		System.out.println("int2DArray4:");
		b = prop.get2DIntArrayProperty("int2DArray4");
		for (int i = 0;  i < b.length; i++) {
			for (int j = 0; j < b[i].length; j++) {
				System.out.print(b[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println();
		
		System.out.println("int3DArray1:");
		c = prop.get3DIntArrayProperty("int3DArray1");
		for (int i = 0;  i < c.length; i++) {
			for (int j = 0; j < c[i].length; j++) {
				for (int k = 0; k < c[i][j].length; k++) {
					System.out.print(c[i][j][k] + " ");
				}
				System.out.println();
			}
			System.out.println();
		}
		
		System.out.println("int3DArray2:");
		c = prop.get3DIntArrayProperty("int3DArray2");
		for (int i = 0;  i < c.length; i++) {
			for (int j = 0; j < c[i].length; j++) {
				for (int k = 0; k < c[i][j].length; k++) {
					System.out.print(c[i][j][k] + " ");
				}
				System.out.println();
			}
			System.out.println();
		}
		
		System.out.println("int3DArray3:");
		c = prop.get3DIntArrayProperty("int3DArray3");
		for (int i = 0;  i < c.length; i++) {
			for (int j = 0; j < c[i].length; j++) {
				for (int k = 0; k < c[i][j].length; k++) {
					System.out.print(c[i][j][k] + " ");
				}
				System.out.println();
			}
			System.out.println();
		}
		
		System.out.println("int3DArray4:");
		c = prop.get3DIntArrayProperty("int3DArray4");
		for (int i = 0;  i < c.length; i++) {
			for (int j = 0; j < c[i].length; j++) {
				for (int k = 0; k < c[i][j].length; k++) {
					System.out.print(c[i][j][k] + " ");
				}
				System.out.println();
			}
			System.out.println();
		}
		
		System.out.println("int3DArray5:");
		c = prop.get3DIntArrayProperty("int3DArray5");
		for (int i = 0;  i < c.length; i++) {
			for (int j = 0; j < c[i].length; j++) {
				for (int k = 0; k < c[i][j].length; k++) {
					System.out.print(c[i][j][k] + " ");
				}
				System.out.println();
			}
			System.out.println();
		}
		
		System.out.println("doubleArray:");
		d = prop.getDoubleArrayProperty("doubleArray");
		for (int i = 0; i < d.length; i++)
			System.out.print(d[i] + " ");
		System.out.println("\n");
		
		System.out.println("double2DArray:");
		e = prop.get2DDoubleArrayProperty("double2DArray");
		for (int i = 0;  i < e.length; i++) {
			for (int j = 0; j < e[i].length; j++) {
				System.out.print(e[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println();
		
		System.out.println("double3DArray:");
		f = prop.get3DDoubleArrayProperty("double3DArray");
		for (int i = 0;  i < f.length; i++) {
			for (int j = 0; j < f[i].length; j++) {
				for (int k = 0; k < f[i][j].length; k++) {
					System.out.print(f[i][j][k] + " ");
				}
				System.out.println();
			}
			System.out.println();
		}
		
		System.out.println("StringArray1:");
		g = prop.getStringArrayProperty("StringArray1");
		for (int i = 0; i < g.length; i++)
			System.out.println(g[i]);
		System.out.println();

		System.out.println("StringArray2:");
		g = prop.getStringArrayProperty("StringArray2");
		for (int i = 0; i < g.length; i++)
			System.out.println(g[i]);
		System.out.println();
		

		// properties can also be optional, and a default value can be provided.
		// if no default value is given, then null is used for strings and arrays,
		// while int and double will have an exception (so you know that there was a problem)
		System.out.println("optionalBoolean: " + prop.getBooleanProperty("optionalBoolean", false));
		System.out.println("optionalInt: " + prop.getIntProperty("optionalInt", -3));
		System.out.println("optionalDouble: " + prop.getDoubleProperty("optionalDouble", 2.71828183));
		System.out.println("optionalString: " + prop.getProperty("optionalString", "Not found"));
		System.out.println("optionalArray: " + prop.getIntArrayProperty("optionalArray"));
		
		
		
		
		// change some of the properties and store the new properties to file
		prop.setProperty("intArray1", new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
		prop.setProperty("stringVal", "I've been changed");
		prop.store("SampleProperties2.txt", "Modified properties file");
		
		
		
		
		// create a new properties file
		prop = new EasyProperties();
		
		a = new int[] {5, 4, 3, 2, 1};
		b = new int[][] {{3, 2, 1}, {6, 5, 4}, {9, 8, 7}, {10}};
		
		f = new double[][][] {{{3.3, 2.2, 1.1}, {0.1}}, {{4.4}}};
		
		g = new String[] {"three", "two", "one", "\"quotes\" example"};
		
		prop.setProperty("booleanVal", true);
		prop.setProperty("intVal", 3);
		prop.setProperty("doubleVal", Math.PI);
		prop.setProperty("stringVal", "Hello World!");
		prop.setProperty("intArray", a);
		prop.setProperty("int2DArray", b);
		prop.setProperty("double3DArray", f);
		prop.setProperty("StringArray", g);
		
		prop.store("Results/NewProperties.txt", "New properties file");
		
		
		// XML output supported in Java 1.5 and later
		/*
		try {
			prop.storeToXML(new FileOutputStream("XMLOutput.xml"), "XML properties file");
		} catch (IOException ex) {
		}
		*/

	}
} // end EasyPropertiesExample class
