/**
 *  Copyright (C) 2010 Cloud.com, Inc.  All rights reserved.
 * 
 * This software is licensed under the GNU General Public License v3 or later.
 * 
 * It 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 3 of the License, or 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.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 */

package com.cloud.test;

import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.net.URISyntaxException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.cloud.host.Status;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDaoImpl;
import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.dao.DiskOfferingDaoImpl;
import com.cloud.utils.PropertiesUtil;
import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.net.NfsUtils;

public class DatabaseConfig {
    private static final Logger s_logger = Logger.getLogger(DatabaseConfig.class.getName());

    private String _configFileName = null;
    private String _currentObjectName = null;
    private String _currentFieldName = null;
    private Map<String, String> _currentObjectParams = null;

    private static Map<String, String> s_configurationDescriptions = new HashMap<String, String>();
    private static Map<String, String> s_configurationComponents = new HashMap<String, String>();
    private static Map<String, String> s_defaultConfigurationValues = new HashMap<String, String>();

    // Change to HashSet
    private static HashSet<String> objectNames = new HashSet<String>();
    private static HashSet<String> fieldNames = new HashSet<String>();
    
    // Maintain an IPRangeConfig object to handle IP related logic
    private final IPRangeConfig iprc = ComponentLocator.inject(IPRangeConfig.class);
    
    // Maintain a PodZoneConfig object to handle Pod/Zone related logic
    private final PodZoneConfig pzc = ComponentLocator.inject(PodZoneConfig.class);
    
    // Global variables to store network.throttling.rate and multicast.throttling.rate from the configuration table
    // Will be changed from null to a non-null value if the value existed in the configuration table
    private String _networkThrottlingRate = null;
    private String _multicastThrottlingRate = null;
    
    static {
    	// initialize the objectNames ArrayList
    	objectNames.add("zone");
    	objectNames.add("vlan");
    	objectNames.add("pod");
        objectNames.add("cluster");	
    	objectNames.add("storagePool");
    	objectNames.add("secondaryStorage");
    	objectNames.add("serviceOffering");
        objectNames.add("diskOffering");
    	objectNames.add("user");
    	objectNames.add("pricing");
    	objectNames.add("configuration");
    	objectNames.add("privateIpAddresses");
    	objectNames.add("publicIpAddresses");
    	
    	// initialize the fieldNames ArrayList
    	fieldNames.add("id");
    	fieldNames.add("name");
    	fieldNames.add("dns1");
    	fieldNames.add("dns2");
    	fieldNames.add("internalDns1");
    	fieldNames.add("internalDns2");
    	fieldNames.add("guestNetworkCidr");
    	fieldNames.add("gateway");
    	fieldNames.add("netmask");
    	fieldNames.add("vncConsoleIp");
    	fieldNames.add("zoneId");
    	fieldNames.add("vlanId");
    	fieldNames.add("cpu");
    	fieldNames.add("ramSize");
    	fieldNames.add("speed");
    	fieldNames.add("useLocalStorage");
    	fieldNames.add("hypervisorType");
    	fieldNames.add("diskSpace");
    	fieldNames.add("nwRate");
    	fieldNames.add("mcRate");
    	fieldNames.add("price");
    	fieldNames.add("username");
    	fieldNames.add("password");
    	fieldNames.add("firstname");
    	fieldNames.add("lastname");
    	fieldNames.add("email");
    	fieldNames.add("priceUnit");
    	fieldNames.add("type");
    	fieldNames.add("value");
    	fieldNames.add("podId");
    	fieldNames.add("podName");
    	fieldNames.add("ipAddressRange");
    	fieldNames.add("vlanType");
    	fieldNames.add("vlanName");
    	fieldNames.add("cidr");
    	fieldNames.add("vnet");
    	fieldNames.add("mirrored");
    	fieldNames.add("enableHA");
    	fieldNames.add("displayText");
    	fieldNames.add("domainId");
    	fieldNames.add("hostAddress");
    	fieldNames.add("hostPath");
    	fieldNames.add("guestIpType");
    	fieldNames.add("url");
    	fieldNames.add("storageType");
    	fieldNames.add("category");
    	fieldNames.add("tags");
    	fieldNames.add("networktype");
        fieldNames.add("clusterId");
    	

    	
        s_configurationDescriptions.put("host.stats.interval", "the interval in milliseconds when host stats are retrieved from agents");
        s_configurationDescriptions.put("storage.stats.interval", "the interval in milliseconds when storage stats (per host) are retrieved from agents");
        s_configurationDescriptions.put("volume.stats.interval", "the interval in milliseconds when volume stats are retrieved from agents");
        s_configurationDescriptions.put("host", "host address to listen on for agent connection");
        s_configurationDescriptions.put("port", "port to listen on for agent connection");
        s_configurationDescriptions.put("guest.domain.suffix", "domain suffix for users");
        s_configurationDescriptions.put("instance.name", "Name of the deployment instance");
        s_configurationDescriptions.put("storage.overprovisioning.factor", "Storage Allocator overprovisioning factor");
        s_configurationDescriptions.put("retries.per.host", "The number of times each command sent to a host should be retried in case of failure.");
        s_configurationDescriptions.put("integration.api.port", "internal port used by the management server for servicing Integration API requests");
        s_configurationDescriptions.put("usage.stats.job.exec.time", "the time at which the usage statistics aggregation job will run as an HH24:MM time, e.g. 00:30 to run at 12:30am");
        s_configurationDescriptions.put("usage.stats.job.aggregation.range", "the range of time for aggregating the user statistics specified in minutes (e.g. 1440 for daily, 60 for hourly)");
        s_configurationDescriptions.put("consoleproxy.domP.enable", "Obsolete");
        s_configurationDescriptions.put("consoleproxy.port", "Obsolete");
        s_configurationDescriptions.put("consoleproxy.url.port", "Console proxy port for AJAX viewer");
        s_configurationDescriptions.put("consoleproxy.ram.size", "RAM size (in MB) used to create new console proxy VMs");
        s_configurationDescriptions.put("consoleproxy.cmd.port", "Console proxy command port that is used to communicate with management server");
        s_configurationDescriptions.put("consoleproxy.loadscan.interval", "The time interval(in milliseconds) to scan console proxy working-load info");
        s_configurationDescriptions.put("consoleproxy.capacityscan.interval", "The time interval(in millisecond) to scan whether or not system needs more console proxy to ensure minimal standby capacity");
        s_configurationDescriptions.put("consoleproxy.capacity.standby", "The minimal number of console proxy viewer sessions that system is able to serve immediately(standby capacity)");
        s_configurationDescriptions.put("alert.email.addresses", "comma seperated list of email addresses used for sending alerts");
        s_configurationDescriptions.put("alert.smtp.host", "SMTP hostname used for sending out email alerts");
        s_configurationDescriptions.put("alert.smtp.port", "port the SMTP server is listening on (default is 25)");
        s_configurationDescriptions.put("alert.smtp.useAuth", "If true, use SMTP authentication when sending emails.  If false, do not use SMTP authentication when sending emails.");
        s_configurationDescriptions.put("alert.smtp.username", "username for SMTP authentication (applies only if alert.smtp.useAuth is true)");
        s_configurationDescriptions.put("alert.smtp.password", "password for SMTP authentication (applies only if alert.smtp.useAuth is true)");
        s_configurationDescriptions.put("alert.email.sender", "sender of alert email (will be in the From header of the email)");
        s_configurationDescriptions.put("memory.capacity.threshold", "percentage (as a value between 0 and 1) of memory utilization above which alerts will be sent about low memory available");
        s_configurationDescriptions.put("cpu.capacity.threshold", "percentage (as a value between 0 and 1) of cpu utilization above which alerts will be sent about low cpu available");
        s_configurationDescriptions.put("storage.capacity.threshold", "percentage (as a value between 0 and 1) of storage utilization above which alerts will be sent about low storage available");
        s_configurationDescriptions.put("public.ip.capacity.threshold", "percentage (as a value between 0 and 1) of public IP address space utilization above which alerts will be sent");
        s_configurationDescriptions.put("private.ip.capacity.threshold", "percentage (as a value between 0 and 1) of private IP address space utilization above which alerts will be sent");
        s_configurationDescriptions.put("expunge.interval", "the interval to wait before running the expunge thread");
        s_configurationDescriptions.put("network.throttling.rate", "default data transfer rate in megabits per second allowed per user");
        s_configurationDescriptions.put("multicast.throttling.rate", "default multicast rate in megabits per second allowed");
        s_configurationDescriptions.put("use.local.storage", "Indicates whether to use local storage pools or shared storage pools for user VMs");
        s_configurationDescriptions.put("use.local.storage", "Indicates whether to use local storage pools or shared storage pools for system VMs.");
        s_configurationDescriptions.put("snapshot.poll.interval", "The time interval in seconds when the management server polls for snapshots to be scheduled.");
        s_configurationDescriptions.put("snapshot.max.hourly", "Maximum hourly snapshots for a volume");
        s_configurationDescriptions.put("snapshot.max.daily", "Maximum daily snapshots for a volume");
        s_configurationDescriptions.put("snapshot.max.weekly", "Maximum weekly snapshots for a volume");
        s_configurationDescriptions.put("snapshot.max.monthly", "Maximum monthly snapshots for a volume");
        s_configurationDescriptions.put("snapshot.delta.max",  "max delta snapshots between two full snapshots.");
        s_configurationDescriptions.put("snapshot.recurring.test", "Flag for testing recurring snapshots");
        s_configurationDescriptions.put("snapshot.test.minutes.per.hour", "Set it to a smaller value to take more recurring snapshots");
        s_configurationDescriptions.put("snapshot.test.hours.per.day", "Set it to a smaller value to take more recurring snapshots");
        s_configurationDescriptions.put("snapshot.test.days.per.week", "Set it to a smaller value to take more recurring snapshots");
        s_configurationDescriptions.put("snapshot.test.days.per.month", "Set it to a smaller value to take more recurring snapshots");
        s_configurationDescriptions.put("snapshot.test.weeks.per.month", "Set it to a smaller value to take more recurring snapshots");
        s_configurationDescriptions.put("snapshot.test.months.per.year", "Set it to a smaller value to take more recurring snapshots");
        s_configurationDescriptions.put("hypervisor.type", "The type of hypervisor that this deployment will use.");
        
        
        s_configurationComponents.put("host.stats.interval", "management-server");
        s_configurationComponents.put("storage.stats.interval", "management-server");
        s_configurationComponents.put("volume.stats.interval", "management-server");
        s_configurationComponents.put("integration.api.port", "management-server");
        s_configurationComponents.put("usage.stats.job.exec.time", "management-server");
        s_configurationComponents.put("usage.stats.job.aggregation.range", "management-server");
		s_configurationComponents.put("consoleproxy.domP.enable", "management-server");
		s_configurationComponents.put("consoleproxy.port", "management-server");
		s_configurationComponents.put("consoleproxy.url.port", "management-server");
        s_configurationComponents.put("alert.email.addresses", "management-server");
        s_configurationComponents.put("alert.smtp.host", "management-server");
        s_configurationComponents.put("alert.smtp.port", "management-server");
        s_configurationComponents.put("alert.smtp.useAuth", "management-server");
        s_configurationComponents.put("alert.smtp.username", "management-server");
        s_configurationComponents.put("alert.smtp.password", "management-server");
        s_configurationComponents.put("alert.email.sender", "management-server");
        s_configurationComponents.put("memory.capacity.threshold", "management-server");
        s_configurationComponents.put("cpu.capacity.threshold", "management-server");
        s_configurationComponents.put("storage.capacity.threshold", "management-server");
        s_configurationComponents.put("public.ip.capacity.threshold", "management-server");
        s_configurationComponents.put("private.ip.capacity.threshold", "management-server");
        s_configurationComponents.put("capacity.check.period", "management-server");
        s_configurationComponents.put("network.throttling.rate", "management-server");
        s_configurationComponents.put("multicast.throttling.rate", "management-server");
        s_configurationComponents.put("account.cleanup.interval", "management-server");
        s_configurationComponents.put("expunge.delay", "UserVmManager");
        s_configurationComponents.put("expunge.interval", "UserVmManager");
        s_configurationComponents.put("host", "AgentManager");
        s_configurationComponents.put("port", "AgentManager");
        s_configurationComponents.put("domain", "AgentManager");
        s_configurationComponents.put("instance.name", "AgentManager");
        s_configurationComponents.put("storage.overprovisioning.factor", "StorageAllocator");
        s_configurationComponents.put("retries.per.host", "AgentManager");
		s_configurationComponents.put("start.retry", "AgentManager");
		s_configurationComponents.put("wait", "AgentManager");
		s_configurationComponents.put("ping.timeout", "AgentManager");
		s_configurationComponents.put("ping.interval", "AgentManager");
		s_configurationComponents.put("alert.wait", "AgentManager");
		s_configurationComponents.put("update.wait", "AgentManager");
		s_configurationComponents.put("guest.domain.suffix", "AgentManager");
		s_configurationComponents.put("consoleproxy.ram.size", "AgentManager");
		s_configurationComponents.put("consoleproxy.cmd.port", "AgentManager");
		s_configurationComponents.put("consoleproxy.loadscan.interval", "AgentManager");
		s_configurationComponents.put("consoleproxy.capacityscan.interval", "AgentManager");
		s_configurationComponents.put("consoleproxy.capacity.standby", "AgentManager");
		s_configurationComponents.put("consoleproxy.session.max", "AgentManager");
		s_configurationComponents.put("consoleproxy.session.timeout", "AgentManager");
		s_configurationComponents.put("expunge.workers", "UserVmManager");
		s_configurationComponents.put("extract.url.cleanup.interval", "management-server");
        s_configurationComponents.put("stop.retry.interval", "HighAvailabilityManager");
        s_configurationComponents.put("restart.retry.interval", "HighAvailabilityManager");
        s_configurationComponents.put("investigate.retry.interval", "HighAvailabilityManager");
        s_configurationComponents.put("migrate.retry.interval", "HighAvailabilityManager");
        s_configurationComponents.put("storage.overwrite.provisioning", "UserVmManager");
        s_configurationComponents.put("init", "none");
        s_configurationComponents.put("system.vm.use.local.storage", "ManagementServer");
        s_configurationComponents.put("use.local.storage", "ManagementServer");
        s_configurationComponents.put("snapshot.poll.interval", "SnapshotManager");
        s_configurationComponents.put("snapshot.max.hourly", "SnapshotManager");
        s_configurationComponents.put("snapshot.max.daily", "SnapshotManager");
        s_configurationComponents.put("snapshot.max.weekly", "SnapshotManager");
        s_configurationComponents.put("snapshot.max.monthly", "SnapshotManager");
        s_configurationComponents.put("snapshot.delta.max", "SnapshotManager");
        s_configurationComponents.put("snapshot.recurring.test", "SnapshotManager");
        s_configurationComponents.put("snapshot.test.minutes.per.hour", "SnapshotManager");
        s_configurationComponents.put("snapshot.test.hours.per.day", "SnapshotManager");
        s_configurationComponents.put("snapshot.test.days.per.week", "SnapshotManager");
        s_configurationComponents.put("snapshot.test.days.per.month", "SnapshotManager");
        s_configurationComponents.put("snapshot.test.weeks.per.month", "SnapshotManager");
        s_configurationComponents.put("snapshot.test.months.per.year", "SnapshotManager");
        s_configurationComponents.put("hypervisor.type", "ManagementServer");

        
        s_defaultConfigurationValues.put("host.stats.interval", "60000");
        s_defaultConfigurationValues.put("storage.stats.interval", "60000");
        //s_defaultConfigurationValues.put("volume.stats.interval", "-1");
        s_defaultConfigurationValues.put("port", "8250");
        s_defaultConfigurationValues.put("integration.api.port", "8096");
        s_defaultConfigurationValues.put("usage.stats.job.exec.time", "00:15"); // run at 12:15am
        s_defaultConfigurationValues.put("usage.stats.job.aggregation.range", "1440"); // do a daily aggregation
        s_defaultConfigurationValues.put("storage.overprovisioning.factor", "2");
        s_defaultConfigurationValues.put("retries.per.host", "2");
        s_defaultConfigurationValues.put("ping.timeout", "2.5");
        s_defaultConfigurationValues.put("ping.interval", "60");
        s_defaultConfigurationValues.put("snapshot.poll.interval", "300");
        s_defaultConfigurationValues.put("snapshot.max.hourly", "8");
        s_defaultConfigurationValues.put("snapshot.max.daily", "8");
        s_defaultConfigurationValues.put("snapshot.max.weekly", "8");
        s_defaultConfigurationValues.put("snapshot.max.monthly", "8");
        s_defaultConfigurationValues.put("snapshot.delta.max", "16");
        s_defaultConfigurationValues.put("snapshot.recurring.test", "false");
        s_defaultConfigurationValues.put("snapshot.test.minutes.per.hour", "60");
        s_defaultConfigurationValues.put("snapshot.test.hours.per.day", "24");
        s_defaultConfigurationValues.put("snapshot.test.days.per.week", "7");
        s_defaultConfigurationValues.put("snapshot.test.days.per.month", "30");
        s_defaultConfigurationValues.put("snapshot.test.weeks.per.month", "4");
        s_defaultConfigurationValues.put("snapshot.test.months.per.year", "12");
        s_defaultConfigurationValues.put("alert.wait", "1800");
        s_defaultConfigurationValues.put("update.wait", "600");
        s_defaultConfigurationValues.put("expunge.interval", "86400");
        s_defaultConfigurationValues.put("extract.url.cleanup.interval",  "120");
        s_defaultConfigurationValues.put("instance.name", "VM");
        s_defaultConfigurationValues.put("expunge.workers", "1");
        s_defaultConfigurationValues.put("stop.retry.interval", "600");
        s_defaultConfigurationValues.put("restart.retry.interval", "600");
        s_defaultConfigurationValues.put("investigate.retry.interval", "60");
        s_defaultConfigurationValues.put("migrate.retry.interval", "120");
        s_defaultConfigurationValues.put("account.cleanup.interval", "86400");
        s_defaultConfigurationValues.put("system.vm.use.local.storage", "false");
        s_defaultConfigurationValues.put("use.local.storage", "false");
        s_defaultConfigurationValues.put("init", "false");
    }
    
    protected DatabaseConfig() {
    }

    /**
     * @param args - name of server-setup.xml file which contains the bootstrap data
     */
    public static void main(String[] args) {
        System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
        System.setProperty("javax.xml.parsers.SAXParserFactory", "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
        
        File file = PropertiesUtil.findConfigFile("log4j-cloud.xml");
        if(file != null) {
			System.out.println("Log4j configuration from : " + file.getAbsolutePath());
			DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000);
		} else {
			System.out.println("Configure log4j with default properties");
		}
        
        if (args.length < 1) {
            s_logger.error("error starting database config, missing initial data file");
        } else {
            try {
                DatabaseConfig config = ComponentLocator.inject(DatabaseConfig.class, args[0]);
                config.doVersionCheck();
                config.doConfig();
                System.exit(0);
            } catch (Exception ex) {
                System.out.print("Error Caught");
                ex.printStackTrace();
                s_logger.error("error", ex);
            }
        }
    }

    public DatabaseConfig(String configFileName) {
        _configFileName = configFileName;
    }
    
    private void doVersionCheck() {
    	try {
    		String warningMsg = "\nYou are using an outdated format for server-setup.xml. Please switch to the new format.\n";
    		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    		DocumentBuilder dbuilder = dbf.newDocumentBuilder();
    		File configFile = new File(_configFileName);
    		Document d = dbuilder.parse(configFile);
    		NodeList nodeList = d.getElementsByTagName("version");
    		
    		if (nodeList.getLength() == 0) {
    			System.out.println(warningMsg);
    			return;
    		}
    		
    		Node firstNode = nodeList.item(0);
    		String version = firstNode.getTextContent();
    		
    		if (!version.equals("2.0")) {
    			System.out.println(warningMsg);
    		}
    		
    	} catch (ParserConfigurationException parserException) {
    		parserException.printStackTrace();
    	} catch (IOException ioException) {
    		ioException.printStackTrace();
    	} catch (SAXException saxException) {
    		saxException.printStackTrace();
    	}
    }

    @DB
    protected void doConfig() {
        Transaction txn = Transaction.currentTxn();
        try {
        	
            File configFile = new File(_configFileName);
            
            SAXParserFactory spfactory = SAXParserFactory.newInstance();
            SAXParser saxParser = spfactory.newSAXParser();
            DbConfigXMLHandler handler = new DbConfigXMLHandler();
            handler.setParent(this);
            
            txn.start();

            // Save user configured values for all fields
            saxParser.parse(configFile, handler);
            
            // Save default values for configuration fields
            saveVMTemplate();
            saveRootDomain();
            saveDefaultConfiguations();
            
            txn.commit();
            // Check pod CIDRs against each other, and against the guest ip network/netmask
            pzc.checkAllPodCidrSubnets();
            
        } catch (Exception ex) {
        	System.out.print("ERROR IS"+ex);
            s_logger.error("error", ex);
            txn.rollback();
        }
    }

    private void setCurrentObjectName(String name) {
        _currentObjectName = name;
    }

    private void saveCurrentObject() {
        if ("zone".equals(_currentObjectName)) {
            saveZone();
        } else if ("vlan".equals(_currentObjectName)) {
        	saveVlan();
        } else if ("pod".equals(_currentObjectName)) {
            savePod();
        } else if ("serviceOffering".equals(_currentObjectName)) {
            saveServiceOffering();
        } else if ("diskOffering".equals(_currentObjectName)) {
            saveDiskOffering();
        } else if ("user".equals(_currentObjectName)) {
            saveUser();
        } else if ("configuration".equals(_currentObjectName)) {
            saveConfiguration();
        } else if ("storagePool".equals(_currentObjectName)) {
        	saveStoragePool();
        } else if ("secondaryStorage".equals(_currentObjectName)) {
        	saveSecondaryStorage();
        } else if ("cluster".equals(_currentObjectName)) {
            saveCluster();
        } 
        _currentObjectParams = null;
    }
    
    @DB
    public void saveSecondaryStorage() {
    	long dataCenterId = Long.parseLong(_currentObjectParams.get("zoneId"));
    	String url = _currentObjectParams.get("url");
    	String mountPoint;
    	try {
    		mountPoint = NfsUtils.url2Mount(url);
    	} catch (URISyntaxException e1) {
    		return;
    	}
    	String insertSql1 = "INSERT INTO `host` (`id`, `name`, `status` , `type` , `private_ip_address`, `private_netmask` ,`private_mac_address` , `storage_ip_address` ,`storage_netmask`, `storage_mac_address`, `data_center_id`, `version`, `dom0_memory`, `last_ping`, `resource`, `guid`, `hypervisor_type`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    	String insertSqlHostDetails = "INSERT INTO `host_details` (`id`, `host_id`, `name`, `value`) VALUES(?,?,?,?)";
        String insertSql2 = "INSERT INTO `op_host` (`id`, `sequence`) VALUES(?, ?)";
    	Transaction txn = Transaction.currentTxn();
    	try {
    		PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
    		stmt.setLong(1, 0);
    		stmt.setString(2, url);
    		stmt.setString(3, "UP");
    		stmt.setString(4, "SecondaryStorage");
    		stmt.setString(5, "192.168.122.1");
    		stmt.setString(6, "255.255.255.0");
    		stmt.setString(7, "92:ff:f5:ad:23:e1");
    		stmt.setString(8, "192.168.122.1");
    		stmt.setString(9, "255.255.255.0");
    		stmt.setString(10, "92:ff:f5:ad:23:e1");
    		stmt.setLong(11, dataCenterId);
    		stmt.setString(12, "2.2.4");
    		stmt.setLong(13, 0);
    		stmt.setLong(14, 1238425896);
    		
    		boolean nfs = false;
    		if (url.startsWith("nfs")) {
    			nfs = true;
    		}
    		if (nfs) {
    		    stmt.setString(15, "com.cloud.storage.resource.NfsSecondaryStorageResource");
    		} else {
    			stmt.setString(15, "com.cloud.storage.secondary.LocalSecondaryStorageResource");
    		}
    		stmt.setString(16, url);
    		stmt.setString(17, "None");
    		stmt.executeUpdate();

    		stmt = txn.prepareAutoCloseStatement(insertSqlHostDetails);
    		stmt.setLong(1, 1);
    		stmt.setLong(2, 1);
    		stmt.setString(3, "mount.parent");
    		if (nfs) {
    			stmt.setString(4, "/mnt");
    		} else {
                stmt.setString(4, "/");
            }
    		stmt.executeUpdate();

    		stmt.setLong(1, 2);
    		stmt.setLong(2, 1);
    		stmt.setString(3, "mount.path");
    		if (nfs) {
    			stmt.setString(4, mountPoint);
    		} else {
                stmt.setString(4, url.replaceFirst("file:/", ""));
            }
    		stmt.executeUpdate();

    		stmt.setLong(1, 3);
    		stmt.setLong(2, 1);
    		stmt.setString(3, "orig.url");
    		stmt.setString(4, url);
    		stmt.executeUpdate();
    		
            stmt = txn.prepareAutoCloseStatement(insertSql2);
            stmt.setLong(1, 1);
            stmt.setLong(2, 1);
            stmt.executeUpdate();
    	} catch (SQLException ex) {
    		System.out.println("Error creating secondary storage: " + ex.getMessage());
    		return;
    	}
    }
    
    @DB
    public void saveCluster() {
        String name = _currentObjectParams.get("name");
        long id = Long.parseLong(_currentObjectParams.get("id"));
        long dataCenterId = Long.parseLong(_currentObjectParams.get("zoneId"));
        long podId = Long.parseLong(_currentObjectParams.get("podId"));
        String hypervisor = _currentObjectParams.get("hypervisorType");
        String insertSql1 = "INSERT INTO `cluster` (`id`, `name`, `data_center_id` , `pod_id`, `hypervisor_type` , `cluster_type`, `allocation_state`) VALUES (?,?,?,?,?,?,?)";
         
        Transaction txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
            stmt.setLong(1, id);
            stmt.setString(2, name);
            stmt.setLong(3, dataCenterId);
            stmt.setLong(4, podId);
            stmt.setString(5, hypervisor);
            stmt.setString(6, "CloudManaged");
            stmt.setString(7, "Enabled");
            stmt.executeUpdate();

        } catch (SQLException ex) {
            System.out.println("Error creating cluster: " + ex.getMessage());
            s_logger.error("error creating cluster", ex);
            return;
        }

    }

    
    @DB
    public void saveStoragePool() {
         String name = _currentObjectParams.get("name");
         long id = Long.parseLong(_currentObjectParams.get("id"));
         long dataCenterId = Long.parseLong(_currentObjectParams.get("zoneId"));
         long podId = Long.parseLong(_currentObjectParams.get("podId"));
         long clusterId = Long.parseLong(_currentObjectParams.get("clusterId"));
         String hostAddress = _currentObjectParams.get("hostAddress");
         String hostPath = _currentObjectParams.get("hostPath");
         String storageType = _currentObjectParams.get("storageType");         
         String uuid = UUID.nameUUIDFromBytes(new String(hostAddress+hostPath).getBytes()).toString();
 
         String insertSql1 = "INSERT INTO `storage_pool` (`id`, `name`, `uuid` , `pool_type` , `port`, `data_center_id` ,`available_bytes` , `capacity_bytes` ,`host_address`, `path`, `created`, `pod_id`,`status` , `cluster_id`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
         // String insertSql2 = "INSERT INTO `netfs_storage_pool` VALUES (?,?,?)";
         
         Transaction txn = Transaction.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
             stmt.setLong(1, id);
             stmt.setString(2, name);
             stmt.setString(3, uuid);
             if (storageType == null) {
                stmt.setString(4, "NetworkFileSystem");
            } else {
                stmt.setString(4, storageType);
            }
             stmt.setLong(5, 111);
             stmt.setLong(6, dataCenterId);
             stmt.setLong(7,0);
             stmt.setLong(8,0);
             stmt.setString(9, hostAddress);
             stmt.setString(10, hostPath);
             stmt.setDate(11, new Date(new java.util.Date().getTime()));
             stmt.setLong(12, podId);
             stmt.setString(13, Status.Up.toString());
             stmt.setLong(14, clusterId);
             stmt.executeUpdate();

         } catch (SQLException ex) {
        	 System.out.println("Error creating storage pool: " + ex.getMessage());
             s_logger.error("error creating storage pool ", ex);
             return;
         }

	}

	private void saveZone() {
        long id = Long.parseLong(_currentObjectParams.get("id"));
        String name = _currentObjectParams.get("name");
        //String description = _currentObjectParams.get("description");
        String dns1 = _currentObjectParams.get("dns1");
        String dns2 = _currentObjectParams.get("dns2");
        String internalDns1 = _currentObjectParams.get("internalDns1");
        String internalDns2 = _currentObjectParams.get("internalDns2");
        String vnetRange = _currentObjectParams.get("vnet");
        String guestNetworkCidr = _currentObjectParams.get("guestNetworkCidr");
        String networkType = _currentObjectParams.get("networktype");
        
        // Check that all IPs are valid
        String ipError = "Please enter a valid IP address for the field: ";
        if (!IPRangeConfig.validOrBlankIP(dns1)) {
            printError(ipError + "dns1");
        }
        if (!IPRangeConfig.validOrBlankIP(dns2)) {
            printError(ipError + "dns2");
        }
        if (!IPRangeConfig.validOrBlankIP(internalDns1)) {
            printError(ipError + "internalDns1");
        }
        if (!IPRangeConfig.validOrBlankIP(internalDns2)) {
            printError(ipError + "internalDns2");
        }
        if (!IPRangeConfig.validCIDR(guestNetworkCidr)) {
            printError("Please enter a valid value for guestNetworkCidr");
        }
    	int vnetStart = -1;
    	int vnetEnd = -1;
    	if (vnetRange != null) {
            String[] tokens = vnetRange.split("-");
            vnetStart = Integer.parseInt(tokens[0]);
            vnetEnd = Integer.parseInt(tokens[1]);
        }
    	
    	pzc.saveZone(false, id, name, dns1, dns2, internalDns1, internalDns2, vnetStart, vnetEnd, guestNetworkCidr, networkType);
        
    }
    
    private void saveVlan() {
    	String zoneId = _currentObjectParams.get("zoneId");
    	String vlanId = _currentObjectParams.get("vlanId");
    	String gateway = _currentObjectParams.get("gateway");
        String netmask = _currentObjectParams.get("netmask");
        String publicIpRange = _currentObjectParams.get("ipAddressRange");
        String vlanType = _currentObjectParams.get("vlanType");
        String vlanPodName = _currentObjectParams.get("podName");
        
        String ipError = "Please enter a valid IP address for the field: ";
        if (!IPRangeConfig.validOrBlankIP(gateway)) {
            printError(ipError + "gateway");
        }
        if (!IPRangeConfig.validOrBlankIP(netmask)) {
            printError(ipError + "netmask");
        }
        
        // Check that the given IP address range was valid
    	if (!checkIpAddressRange(publicIpRange)) {
            printError("Please enter a valid public IP range.");
        }
        
    	// Split the IP address range
    	String[] ipAddressRangeArray = publicIpRange.split("\\-");
    	String startIP = ipAddressRangeArray[0];
    	String endIP = null;
    	if (ipAddressRangeArray.length > 1) {
            endIP = ipAddressRangeArray[1];
        }
    	
    	// If a netmask was provided, check that the startIP, endIP, and gateway all belong to the same subnet
    	if (netmask != null && netmask != "") {
    		if (endIP != null) {
    			if (!IPRangeConfig.sameSubnet(startIP, endIP, netmask)) {
                    printError("Start and end IPs for the public IP range must be in the same subnet, as per the provided netmask.");
                }
    		}
    		
    		if (gateway != null && gateway != "") {
    			if (!IPRangeConfig.sameSubnet(startIP, gateway, netmask)) {
                    printError("The start IP for the public IP range must be in the same subnet as the gateway, as per the provided netmask.");
                }
    			if (endIP != null) {
    				if (!IPRangeConfig.sameSubnet(endIP, gateway, netmask)) {
                        printError("The end IP for the public IP range must be in the same subnet as the gateway, as per the provided netmask.");
                    }
    			}
    		}
    	}
    	
    	long zoneDbId = Long.parseLong(zoneId);
    	String zoneName = PodZoneConfig.getZoneName(zoneDbId);
    	
    	//Set networkId to be 0, the value will be updated after management server starts up
    	pzc.modifyVlan(zoneName, true, vlanId, gateway, netmask, vlanPodName, vlanType, publicIpRange, 0);
    	
    	long vlanDbId = pzc.getVlanDbId(zoneName, vlanId);
    	iprc.saveIPRange("public", -1, zoneDbId, vlanDbId, startIP, endIP, null);
        
    }

    private void savePod() {
        long id = Long.parseLong(_currentObjectParams.get("id"));
        String name = _currentObjectParams.get("name");
        long dataCenterId = Long.parseLong(_currentObjectParams.get("zoneId"));
        String privateIpRange = _currentObjectParams.get("ipAddressRange");
        String gateway = _currentObjectParams.get("gateway");
        String cidr = _currentObjectParams.get("cidr");
        String zoneName = PodZoneConfig.getZoneName(dataCenterId);
        String startIP = null;
        String endIP = null;
        String vlanRange = _currentObjectParams.get("vnet");
        
        int vlanStart = -1;
        int vlanEnd = -1;
        if (vlanRange != null) {
            String[] tokens = vlanRange.split("-");
            vlanStart = Integer.parseInt(tokens[0]);
            vlanEnd = Integer.parseInt(tokens[1]);
        }
        
        // Get the individual cidrAddress and cidrSize values
		String[] cidrPair = cidr.split("\\/");
		String cidrAddress = cidrPair[0];
		String cidrSize = cidrPair[1];
        long cidrSizeNum = Long.parseLong(cidrSize);
        
        // Check that the gateway is in the same subnet as the CIDR
    	if (!IPRangeConfig.sameSubnetCIDR(gateway, cidrAddress, cidrSizeNum)) {
    		printError("For pod " + name + " in zone " + zoneName + " , please ensure that your gateway is in the same subnet as the  pod's CIDR address.");
    	}
        
        pzc.savePod(false, id, name, dataCenterId, gateway, cidr, vlanStart, vlanEnd);
                       
		if (privateIpRange != null) {
			// Check that the given IP address range was valid
			if (!checkIpAddressRange(privateIpRange)) {
                printError("Please enter a valid private IP range.");
            }
    		
    		String[] ipAddressRangeArray = privateIpRange.split("\\-");
    		startIP = ipAddressRangeArray[0];
    		endIP = null;
    		if (ipAddressRangeArray.length > 1) {
                endIP = ipAddressRangeArray[1];
            }
		}
    	
    	// Check that the start IP and end IP match up with the CIDR
    	if (!IPRangeConfig.sameSubnetCIDR(startIP, endIP, cidrSizeNum)) {
    		printError("For pod " + name + " in zone " + zoneName + ", please ensure that your start IP and end IP are in the same subnet, as per the pod's CIDR size.");
    	}
    	
		if (!IPRangeConfig.sameSubnetCIDR(startIP, cidrAddress, cidrSizeNum)) {
			printError("For pod " + name + " in zone " + zoneName + ", please ensure that your start IP is in the same subnet as the pod's CIDR address.");
		}
		
		if (!IPRangeConfig.sameSubnetCIDR(endIP, cidrAddress, cidrSizeNum)) {
			printError("For pod " + name + " in zone " + zoneName + ", please ensure that your end IP is in the same subnet as the pod's CIDR address.");
		}
    	
		if (privateIpRange != null) {
			// Save the IP address range
			iprc.saveIPRange("private", id, dataCenterId, -1, startIP, endIP, null);
		}

    }

    @DB
    protected void saveServiceOffering() {
        long id  = Long.parseLong(_currentObjectParams.get("id"));
        String name = _currentObjectParams.get("name");
        String displayText = _currentObjectParams.get("displayText");
        int cpu = Integer.parseInt(_currentObjectParams.get("cpu"));
        int ramSize = Integer.parseInt(_currentObjectParams.get("ramSize"));
        int speed = Integer.parseInt(_currentObjectParams.get("speed"));
        String useLocalStorageValue = _currentObjectParams.get("useLocalStorage");
                
//        int nwRate = Integer.parseInt(_currentObjectParams.get("nwRate"));
//        int mcRate = Integer.parseInt(_currentObjectParams.get("mcRate"));
        boolean ha = Boolean.parseBoolean(_currentObjectParams.get("enableHA"));
        boolean mirroring = Boolean.parseBoolean(_currentObjectParams.get("mirrored"));
        
        boolean useLocalStorage;
        if (useLocalStorageValue != null) {
        	if (Boolean.parseBoolean(useLocalStorageValue)) {
        		useLocalStorage = true;
        	} else {
        		useLocalStorage = false;
        	}
        } else {
        	useLocalStorage = false;
        }
        
        ServiceOfferingVO serviceOffering = new ServiceOfferingVO(name, cpu, ramSize, speed, null, null, ha, displayText, useLocalStorage, false, null, false, null, false);
        ServiceOfferingDaoImpl dao = ComponentLocator.inject(ServiceOfferingDaoImpl.class);
        try {
            dao.persist(serviceOffering);
        } catch (Exception e) {
            s_logger.error("error creating service offering", e);
            
        }
        /*
        String insertSql = "INSERT INTO `cloud`.`service_offering` (id, name, cpu, ram_size, speed, nw_rate, mc_rate, created, ha_enabled, mirrored, display_text, guest_ip_type, use_local_storage) " +
                "VALUES (" + id + ",'" + name + "'," + cpu + "," + ramSize + "," + speed + "," + nwRate + "," + mcRate + ",now()," + ha + "," + mirroring + ",'" + displayText + "','" + guestIpType + "','" + useLocalStorage + "')";

        Transaction txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
            stmt.executeUpdate();
        } catch (SQLException ex) {
            s_logger.error("error creating service offering", ex);
            return;
        }
        */
    }
    
    @DB
    protected void saveDiskOffering() {
        long id  = Long.parseLong(_currentObjectParams.get("id"));
        long domainId  = Long.parseLong(_currentObjectParams.get("domainId"));
        String name = _currentObjectParams.get("name");
        String displayText = _currentObjectParams.get("displayText");
        long diskSpace = Long.parseLong(_currentObjectParams.get("diskSpace"));
        diskSpace = diskSpace * 1024 * 1024;
//        boolean mirroring = Boolean.parseBoolean(_currentObjectParams.get("mirrored"));
        String tags = _currentObjectParams.get("tags");
        String useLocal = _currentObjectParams.get("useLocal");
        boolean local = false;
        if (useLocal != null) {
        	local = Boolean.parseBoolean(useLocal);
        }
        
        if (tags != null && tags.length() > 0) {
            String[] tokens = tags.split(",");
            StringBuilder newTags = new StringBuilder();
            for (String token : tokens) {
                newTags.append(token.trim()).append(",");
            }
            newTags.delete(newTags.length() - 1, newTags.length());
            tags = newTags.toString();
        }
        DiskOfferingVO diskOffering = new DiskOfferingVO(domainId, name, displayText, diskSpace , tags, false);
        diskOffering.setUseLocalStorage(local);
        DiskOfferingDaoImpl offering = ComponentLocator.inject(DiskOfferingDaoImpl.class);
        try {
            offering.persist(diskOffering);
        } catch (Exception e) {
            s_logger.error("error creating disk offering", e);
            
        }
        /*
        String insertSql = "INSERT INTO `cloud`.`disk_offering` (id, domain_id, name, display_text, disk_size, mirrored, tags) " +
                "VALUES (" + id + "," + domainId + ",'" + name + "','" + displayText + "'," + diskSpace + "," + mirroring + ", ? )";

        Transaction txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
            stmt.setString(1, tags);
            stmt.executeUpdate();
        } catch (SQLException ex) {
            s_logger.error("error creating disk offering", ex);
            return;
        }
        */
    }
    
    @DB
    protected void saveThrottlingRates() {
    	boolean saveNetworkThrottlingRate = (_networkThrottlingRate != null);
    	boolean saveMulticastThrottlingRate = (_multicastThrottlingRate != null);
    	
    	if (!saveNetworkThrottlingRate && !saveMulticastThrottlingRate) {
            return;
        }
    	
    	String insertNWRateSql = "UPDATE `cloud`.`service_offering` SET `nw_rate` = ?";
    	String insertMCRateSql = "UPDATE `cloud`.`service_offering` SET `mc_rate` = ?";
    	
        Transaction txn = Transaction.currentTxn();
    	try {
            PreparedStatement stmt;
            
            if (saveNetworkThrottlingRate) {
            	stmt = txn.prepareAutoCloseStatement(insertNWRateSql);
            	stmt.setString(1, _networkThrottlingRate);
            	stmt.executeUpdate();
            }
            
            if (saveMulticastThrottlingRate) {
            	stmt = txn.prepareAutoCloseStatement(insertMCRateSql);
            	stmt.setString(1, _multicastThrottlingRate);
            	stmt.executeUpdate();
            }
            
        } catch (SQLException ex) {
            s_logger.error("error saving network and multicast throttling rates to all service offerings", ex);
            return;
        }
    }

    // no configurable values for VM Template, hard-code the defaults for now
    private void saveVMTemplate() {
    /*
        long id = 1;
        String uniqueName = "routing";
        String name = "DomR Template";
        int isPublic = 0;
        String path = "template/private/u000000/os/routing";
        String type = "ext3";
        int requiresHvm = 0;
        int bits = 64;
        long createdByUserId = 1;
        int isReady = 1;

        String insertSql = "INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, ready) " +
                "VALUES (" + id + ",'" + uniqueName + "','" + name + "'," + isPublic + ",'" + path + "',now(),'" + type + "'," +
                requiresHvm + "," + bits + "," + createdByUserId + "," + isReady + ")";

        Transaction txn = Transaction.open();
        try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
            stmt.executeUpdate();
        } catch (SQLException ex) {
            s_logger.error("error creating vm template: " + ex);
        } finally {
        	txn.close();
        }
     */
/*
        // do it again for console proxy template
        id = 2;
        uniqueName = "consoleproxy";
        name = "Console Proxy Template";
        isPublic = 0;
        path = "template/private/u000000/os/consoleproxy";
        type = "ext3";
        
        insertSql = "INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, ready) " +
        "VALUES (" + id + ",'" + uniqueName + "','" + name + "'," + isPublic + ",'" + path + "',now(),'" + type + "'," +
        requiresHvm + "," + bits + "," + createdByUserId + "," + isReady + ")";

	    Transaction txn = Transaction.currentTxn();
		try {
		    PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
		    stmt.executeUpdate();
		} catch (SQLException ex) {
		    s_logger.error("error creating vm template: " + ex);
		} finally {
			txn.close();
		}
*/
    }

    @DB
    protected void saveUser() {
        // insert system account
        String insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (1, 'system', '1', '1')";
        Transaction txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
            stmt.executeUpdate();
        } catch (SQLException ex) {
            s_logger.error("error creating system account", ex);
        }

        // insert system user
        insertSql = "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, created) VALUES (1, 'system', '', 1, 'system', 'cloud', now())";
	    txn = Transaction.currentTxn();
		try {
		    PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
		    stmt.executeUpdate();
		} catch (SQLException ex) {
		    s_logger.error("error creating system user", ex);
		}
		
    	// insert admin user
        long id = Long.parseLong(_currentObjectParams.get("id"));
        String username = _currentObjectParams.get("username");
        String firstname = _currentObjectParams.get("firstname");
        String lastname = _currentObjectParams.get("lastname");
        String password = _currentObjectParams.get("password");
        String email = _currentObjectParams.get("email");
        
        if (email == null || email.equals("")) {
            printError("An email address for each user is required.");
        }
        
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            s_logger.error("error saving user", e);
            return;
        }
        md5.reset();
        BigInteger pwInt = new BigInteger(1, md5.digest(password.getBytes()));
        String pwStr = pwInt.toString(16);
        int padding = 32 - pwStr.length();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < padding; i++) {
            sb.append('0'); // make sure the MD5 password is 32 digits long
        }
        sb.append(pwStr);

        // create an account for the admin user first
        insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (" + id + ", '" + username + "', '1', '1')";
        txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
            stmt.executeUpdate();
        } catch (SQLException ex) {
            s_logger.error("error creating account", ex);
        }

        // now insert the user
        insertSql = "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, email, created) " +
                "VALUES (" + id + ",'" + username + "','" + sb.toString() + "', 2, '" + firstname + "','" + lastname + "','" + email + "',now())";

        txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
            stmt.executeUpdate();
        } catch (SQLException ex) {
            s_logger.error("error creating user", ex);
        }
    }

    private void saveDefaultConfiguations() {
        for (String name : s_defaultConfigurationValues.keySet()) {
            String value = s_defaultConfigurationValues.get(name);
            saveConfiguration(name, value, null);
        }
    }
    
    private void saveConfiguration() {
        String name = _currentObjectParams.get("name");
        String value = _currentObjectParams.get("value");
        String category = _currentObjectParams.get("category");
        saveConfiguration(name, value, category);
    }
    
    @DB
    protected void saveConfiguration(String name, String value, String category) {
        String instance = "DEFAULT";
        String description = s_configurationDescriptions.get(name);
        String component = s_configurationComponents.get(name);
        if (category == null) {
        	category = "Advanced";
        }
        
        String instanceNameError = "Please enter a non-blank value for the field: ";
        if (name.equals("instance.name")) {
        	if (value == null || value.isEmpty() || !value.matches("^[A-Za-z0-9]{1,8}$")) {
                printError(instanceNameError + "configuration: instance.name can not be empty and can only contain numbers and alphabets up to 8 characters long");
            }
        }
        
        if (name.equals("network.throttling.rate")) {
        	if (value != null && !value.isEmpty()) {
                _networkThrottlingRate = value;
            }
        }
        
        if (name.equals("multicast.throttling.rate")) {
        	if (value != null && !value.isEmpty()) {
                _multicastThrottlingRate = value;
            }
        }

        String insertSql = "INSERT INTO `cloud`.`configuration` (instance, component, name, value, description, category) " +
            "VALUES ('" + instance + "','" + component + "','" + name + "','" + value + "','" + description + "','" + category + "')";
        
        String selectSql = "SELECT name FROM cloud.configuration WHERE name = '" + name + "'";

        Transaction txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
            ResultSet result = stmt.executeQuery();
            Boolean hasRow = result.next();
            if (!hasRow) {
            	stmt = txn.prepareAutoCloseStatement(insertSql);
            	stmt.executeUpdate();
            }
        } catch (SQLException ex) {
            s_logger.error("error creating configuration", ex);
        }
    }
    
    private boolean checkIpAddressRange(String ipAddressRange) {
    	String[] ipAddressRangeArray = ipAddressRange.split("\\-");
    	String startIP = ipAddressRangeArray[0];
    	String endIP = null;
    	if (ipAddressRangeArray.length > 1) {
            endIP = ipAddressRangeArray[1];
        }
    	
    	if (!IPRangeConfig.validIP(startIP)) {
    		s_logger.error("The private IP address: " + startIP + " is invalid.");
    		return false;
    	}
    	
    	if (!IPRangeConfig.validOrBlankIP(endIP)) {
    		s_logger.error("The private IP address: " + endIP + " is invalid.");
    		return false;
    	}
    	
    	if (!IPRangeConfig.validIPRange(startIP, endIP)) {
    		s_logger.error("The  IP range " + startIP + " -> " + endIP + " is invalid.");
    		return false;
    	}
    	
    	return true;
    }

    @DB
    protected void saveRootDomain() {
        String insertSql = "insert into `cloud`.`domain` (id, name, parent, owner, path, level) values (1, 'ROOT', NULL, 2, '/', 0)";
        Transaction txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
            stmt.executeUpdate();
        } catch (SQLException ex) {
            s_logger.error("error creating ROOT domain", ex);
        }
        
        /*
        String updateSql = "update account set domain_id = 1 where id = 2";
        Transaction txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareStatement(updateSql);
            stmt.executeUpdate();
        } catch (SQLException ex) {
            s_logger.error("error updating admin user", ex);
        } finally {
        	txn.close();
        }

        updateSql = "update account set domain_id = 1 where id = 1";
        Transaction txn = Transaction.currentTxn();
        try {
            PreparedStatement stmt = txn.prepareStatement(updateSql);
            stmt.executeUpdate();
        } catch (SQLException ex) {
            s_logger.error("error updating system user", ex);
        } finally {
        	txn.close();
        }
        */
    }

    class DbConfigXMLHandler extends DefaultHandler {
        private DatabaseConfig _parent = null;

        public void setParent(DatabaseConfig parent) {
            _parent = parent;
        }

        @Override
        public void endElement(String s, String s1, String s2)
                throws SAXException {
            if (DatabaseConfig.objectNames.contains(s2) || "object".equals(s2)) {
                _parent.saveCurrentObject();
            } else if (DatabaseConfig.fieldNames.contains(s2) || "field".equals(s2)) {
                _currentFieldName = null;
            }
        }

        @Override
        public void startElement(String s, String s1, String s2,
                Attributes attributes) throws SAXException {
        	if ("object".equals(s2)) {
        		_parent.setCurrentObjectName(convertName(attributes.getValue("name")));
           } else if ("field".equals(s2)) {
               if (_currentObjectParams == null) {
                   _currentObjectParams = new HashMap<String, String>();
               }
               _currentFieldName = convertName(attributes.getValue("name"));
           } else if (DatabaseConfig.objectNames.contains(s2)) {
                _parent.setCurrentObjectName(s2);
            } else if (DatabaseConfig.fieldNames.contains(s2)) {
                if (_currentObjectParams == null) {
                    _currentObjectParams = new HashMap<String, String>();
                }
                _currentFieldName = s2;
            }
        }

        @Override
		public void characters(char[] ch, int start, int length) throws SAXException {
            if ((_currentObjectParams != null) && (_currentFieldName != null)) {
                String currentFieldVal = new String(ch, start, length);
                _currentObjectParams.put(_currentFieldName, currentFieldVal);
            }
        }
        
        private String convertName(String name) {
    		if (name.contains(".")){
    			String[] nameArray = name.split("\\.");
    			for (int i = 1; i < nameArray.length; i++) {
    				String word = nameArray[i];
    				nameArray[i] = word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase();
    			}
    			name = "";
    			for (int i = 0; i < nameArray.length; i++) {
    				name = name.concat(nameArray[i]);
    			}
    		}
    		return name;
    	}
    }
    
    public static List<String> genReturnList(String success, String message) {
		List<String> returnList = new ArrayList<String>(2);
		returnList.add(0, success);
		returnList.add(1, message);
		return returnList;
	}
    
    public static void printError(String message) {
    	System.out.println(message);
    	System.exit(1);
    }

    public static String getDatabaseValueString(String selectSql, String name, String errorMsg) {
		Transaction txn = Transaction.open("getDatabaseValueString");
		PreparedStatement stmt = null;
		
		try {
			stmt = txn.prepareAutoCloseStatement(selectSql);
			ResultSet rs = stmt.executeQuery();
	    	if (rs.next()) {
	    		String value = rs.getString(name);
	    		return value;
	    	} else {
                return null;
            }
		} catch (SQLException e) {
			System.out.println("Exception: " + e.getMessage());
			printError(errorMsg);
		} finally {
		    txn.close();
		}
		return null;
	}
    
    public static long getDatabaseValueLong(String selectSql, String name, String errorMsg) {
		Transaction txn = Transaction.open("getDatabaseValueLong");
		PreparedStatement stmt = null;
		
		try {
			stmt = txn.prepareAutoCloseStatement(selectSql);
			ResultSet rs = stmt.executeQuery();
	    	if (rs.next()) {
                return rs.getLong(name);
            } else {
                return -1;
            }
		} catch (SQLException e) {
			System.out.println("Exception: " + e.getMessage());
			printError(errorMsg);
		} finally {
		    txn.close();
		}
		return -1;
	}
    
    public static void saveSQL(String sql, String errorMsg) {
        Transaction txn = Transaction.open("saveSQL");
		try {
            PreparedStatement stmt = txn.prepareAutoCloseStatement(sql);
            stmt.executeUpdate();
        } catch (SQLException ex) {
        	System.out.println("SQL Exception: " + ex.getMessage());
            printError(errorMsg);
        } finally {
            txn.close();
        }
	}
   
}
