package edu.hawaii.ics.yucheng; import java.util.ArrayList; import java.util.Properties; /** * An immutable class that contains the configuration information for a cluster * of nodes and a catalog. They are parsed from the 'clustercfg' file, and works * specifically as the configuration for uploading CSVs to a table on this * distributed system. * * @author Cheng Jade * @assignment ICS 421 Project * @date Mar 22, 2010 * @bugs None */ public class LoadCSVConfiguration { public final ConfigurationNode catalog; public final String tableName; public final String partitionMethod; public final String partitionColumn; public final int nodeNumber; public final ArrayList<NodeParamPair> nodes = new ArrayList<NodeParamPair>(); /** * a inner class that groups the partition parameters together with its * node. */ public class NodeParamPair { public final ConfigurationNode node; public final String param1; public final String param2; /** * initialize an instance of this object. */ public NodeParamPair(final ConfigurationNode node, final String param1, final String param2) throws ProgramException { if (null == node) throw new ProgramException("Invalide Configuration, mismatch node id"); if (null == param1) throw new ProgramException("Invalide Configuration, param1 not found on " + node.name); this.node = node; this.param1 = param1; this.param2 = param2; } /** * return a string with class data. */ @Override public String toString() { final StringBuilder builder = new StringBuilder(); builder.append(this.node); builder.append("\n param1: " + this.param1); builder.append("\n param2: " + this.param2); return builder.toString(); } } /** * return a string with class data. */ @Override public String toString() { final StringBuilder builder = new StringBuilder(); builder.append("- catalog:\n" + this.catalog); builder.append("\n- table name: " + this.tableName); builder.append("\n- partition method: " + this.partitionMethod); builder.append("\n- partition column: " + this.partitionColumn); builder.append("\n- relevant nodes with partition params:"); for (final NodeParamPair pair : this.nodes) builder.append("\n node: \n" + pair); return builder.toString(); } /** * initialize an instance of this object */ public LoadCSVConfiguration(final Properties properties, final ConfigurationNode catalog) throws ProgramException { this.catalog = catalog; this.tableName = properties.getProperty("tablename"); this.partitionMethod = properties.getProperty("partition.method"); this.partitionColumn = properties.getProperty("partition.column"); final ArrayList<ConfigurationNode> plainNodes = this.catalog.getNodesFromCatalog(this.tableName); String nodeNumber = null; if (this.partitionMethod.equalsIgnoreCase("range")) { nodeNumber = properties.getProperty("numnodes"); for (int i = 1; i <= plainNodes.size(); i++) { final String param1 = properties.getProperty("partition.node" + i + ".param1"); final String param2 = properties.getProperty("partition.node" + i + ".param2"); for (int j = 0; j < plainNodes.size(); j++) { if (plainNodes.get(j).name.substring(4).equalsIgnoreCase(Integer.toString(i))) { final ConfigurationNode node = plainNodes.get(j); this.nodes.add(new NodeParamPair(node, param1, param2)); break; } } } } else if (this.partitionMethod.equalsIgnoreCase("hash")) { nodeNumber = properties.getProperty("partition.param1"); for (int i = 0; i < plainNodes.size(); i++) this.nodes.add(new NodeParamPair(plainNodes.get(i), nodeNumber, null)); } else throw new ProgramException("Invalid Cofiguration, only range and hash partition methods are supported"); try { this.nodeNumber = Integer.parseInt(nodeNumber); if (this.nodeNumber != this.nodes.size()) throw new ProgramException("Invalid Configuration, mismatch node number"); } catch (final NumberFormatException e) { throw new ProgramException("Invaild Configuration, invalid node number format"); } if (this.catalog == null) throw new ProgramException("Invalid Configuratin, missing catalog"); if (this.tableName == null) throw new ProgramException("Invalid Configuratin, missing table name"); if (this.partitionMethod == null) throw new ProgramException("Invalid Configuratin, missing partition method"); if (this.partitionColumn == null) throw new ProgramException("Invalid Configuratin, missing partition column"); } }