LoadCSVConfiguration.java

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");
    }

}
Valid HTML 4.01 Valid CSS