package edu.hawaii.ics.yucheng;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
/**
* An enum that defines the types of different queries supported by this program.
*/
enum ConfigurationType {
createOrDrop, loadCSV, selectOrJoin;
}
/**
* An object that contains the shared portion of different configuration files.
*
* @author Cheng Jade
* @assignment ICS 421 Assignment 4
* @date Mar 22, 2010
* @bugs None
*/
public class SharedConfiguration {
// The catalog node configuration
public final ConfigurationNode catalog;
public final Properties properties;
public ConfigurationType type;
/**
* Initialize a new instance of this object.
*/
public SharedConfiguration(final String path) throws ProgramException {
// Throw an exception if the specified path is null.
if (null == path)
throw new NullPointerException("path");
// Declare a Properties object and load it with the specified file.
this.properties = getProperties(path);
this.catalog = new ConfigurationNode(properties, "catalog");
if (properties.getProperty("tablename") != null) {
this.type = ConfigurationType.loadCSV;
} else if (properties.getProperty("numnodes") != null) {
this.type = ConfigurationType.createOrDrop;
} else
this.type = ConfigurationType.selectOrJoin;
}
/**
* returns a runnable that executes a given list of SQL statements (select
* or join statements) or load a given list of CSV entries.
*
* @param sqlsOrCSV
* The given list of SQL statements or CSV entries.
*
* @return an object that implements Runnable.
*/
public Runnable getRunnable(final ArrayList<String> sqlsOrCSV) throws ProgramException {
if (this.type == ConfigurationType.loadCSV) {
final LoadCSVConfiguration config = new LoadCSVConfiguration(properties, catalog);
return new LoadCSV(config, sqlsOrCSV);
}
if (this.type == ConfigurationType.createOrDrop) {
final CreateOrDropConfiguration config = new CreateOrDropConfiguration(properties, catalog);
return new CreateOrDrop(config, sqlsOrCSV);
}
final SelectOrJoinConfiguration config = new SelectOrJoinConfiguration(properties, catalog);
return new SelectOrJoin(config, sqlsOrCSV);
}
/**
* Open a file, check for errors, and return a loaded properties object.
*
* @param path
* The path to the properties file.
*
* @return A loaded properties object.
*
* @throws ProgramException
* Thrown if there is a problem reading the configuration file.
*/
private static Properties getProperties(final String path)
throws ProgramException {
assert null != path;
try {
final FileInputStream file = new FileInputStream(path);
try {
final Properties properties = new Properties();
properties.load(file);
return properties;
} finally {
file.close();
}
} catch (final IOException e) {
throw new ProgramException("Cannot read configuration file.", e);
}
}
/**
* a test main
*/
public static void main(String[] args) {
assert null != args;
// Print usage information, if wrong number of arguments were used.
if (args.length != 1) {
final String name = SharedConfiguration.class.getSimpleName();
System.err.println("Usage: java " + name + " <path>");
System.err.println(" <path> path to a configuration file");
System.exit(1);
return;
}
try {
// final SharedConfiguration config = new
// SharedConfiguration(args[0]);
// System.out.println(config.getConfiguration());
} catch (final Exception e) {
System.err.println("faile to parse due to: " + e.getMessage());
System.exit(1);
}
}
}