cloudoutput.dao.CustomerRegistryDAO.java Source code

Java tutorial

Introduction

Here is the source code for cloudoutput.dao.CustomerRegistryDAO.java

Source

/* 
 * Copyright (c) 2010-2012 Thiago T. S
 * 
 * This file is part of cloudoutput.
 *
 * cloudoutput 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
 * (at your option) any later version.
 * 
 * cloudoutput 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.
 *
 * For more information about your rights as a user of cloudoutput,
 * refer to the LICENSE file or see <http://www.gnu.org/licenses/>.
 */

package cloudoutput.dao;

import java.util.List;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import cloudoutput.database.Database;
import cloudoutput.database.HibernateUtil;
import cloudoutput.models.CustomerRegistry;
import cloudoutput.models.UtilizationProfile;
import cloudoutput.models.VirtualMachineRegistry;
import cloudoutput.utils.LongOperations;

/**
 * CustomerRegistryDAO provides basic CRUD operations related to the 
 * {@link CustomerRegistry} class.
 * It also provides access to general information about virtual machines
 * deployed by a given customer.
 * 
 * @see         CustomerRegistry
 * @author      Thiago T. S
 * @since       1.0
 */
public class CustomerRegistryDAO {

    /** 
     * Inserts a new customer registry into the database.
     * The customer's name must be unique.
     *
     * @param   cr      the customer registry to be inserted.
     * @return          <code>true</code> if the customer registry
     *                  has been successfully inserted; 
     *                  <code>false</code> otherwise.
     * @see             CustomerRegistry
     * @since           1.0
     */
    public boolean insertNewCustomerRegistry(CustomerRegistry cr) {
        Session session = HibernateUtil.getSession();
        try {
            CustomerRegistry customer = (CustomerRegistry) session.createCriteria(CustomerRegistry.class)
                    .add(Restrictions.eq("name", cr.getName())).uniqueResult();

            //The customer's name must be unique
            if (customer != null)
                return false;

            session.beginTransaction();
            session.save(cr);
            session.getTransaction().commit();
        } catch (HibernateException ex) {
            session.getTransaction().rollback();
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            HibernateUtil.closeSession(session);
        }

        //Insert new network entries
        NetworkMapEntryDAO neDAO = new NetworkMapEntryDAO();
        neDAO.insertNewEntityEntries(cr.getName());

        return true;
    }

    /** 
     * Gets an existing customer with the given name.
     *
     * @param   customerName    the name of the customer to be retrieved.
     * @return                  the customer, if it exists; <code>null</code>
     *                          otherwise.
     * @see                     CustomerRegistry
     * @since                   1.0
     */
    public CustomerRegistry getCustomerRegistry(String customerName) {
        Session session = HibernateUtil.getSession();
        CustomerRegistry customer = null;
        try {
            customer = (CustomerRegistry) session.createCriteria(CustomerRegistry.class)
                    .add(Restrictions.eq("name", customerName)).uniqueResult();
        } catch (HibernateException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            HibernateUtil.closeSession(session);
        }

        return customer;
    }

    /** 
     * Gets an existing customer with the given id.
     *
     * @param   customerId      the id of the customer to be retrieved.
     * @return                  the customer, if it exists; <code>null</code>
     *                          otherwise.
     * @see                     CustomerRegistry
     * @since                   1.0
     */
    public CustomerRegistry getCustomerRegistry(long customerId) {
        Session session = HibernateUtil.getSession();
        CustomerRegistry customer = null;
        try {
            customer = (CustomerRegistry) session.createCriteria(CustomerRegistry.class)
                    .add(Restrictions.eq("id", customerId)).uniqueResult();
        } catch (HibernateException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            HibernateUtil.closeSession(session);
        }

        return customer;
    }

    /** 
     * Updates an existing customer registry.
     *
     * @param   customer        the customer to be updated.
     * @see                     CustomerRegistry
     * @since                   1.0
     */
    public void updateCustomerRegistry(CustomerRegistry customer) {
        Session session = HibernateUtil.getSession();
        try {
            session.beginTransaction();
            session.update(customer);
            session.getTransaction().commit();
        } catch (HibernateException ex) {
            session.getTransaction().rollback();
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /** 
     * Removes an existing customer with the given name.
     *
     * @param   customerName    the id of the customer to be removed.
     * @return                  <code>true</code>, if the customer has been
     *                          successfully removed; <code>false</code>
     *                          otherwise.
     * @see                     CustomerRegistry
     * @since                   1.0
     */
    public boolean removeCustomerRegistry(String customerName) {
        Session session = HibernateUtil.getSession();
        try {
            CustomerRegistry customer = (CustomerRegistry) session.createCriteria(CustomerRegistry.class)
                    .add(Restrictions.eq("name", customerName)).uniqueResult();

            if (customer == null)
                return false;

            session.beginTransaction();
            session.delete(customer);
            session.getTransaction().commit();
        } catch (HibernateException ex) {
            session.getTransaction().rollback();
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            HibernateUtil.closeSession(session);
        }

        //Remove network entries
        NetworkMapEntryDAO neDAO = new NetworkMapEntryDAO();
        neDAO.removeEntries(customerName);

        return true;
    }

    /** 
     * Gets a list of all existing customers.
     *
     * @return                  a list containing all the customer registries
     *                          in the database; <code>null</code> if no
     *                          customers were found.
     * @see                     CustomerRegistry
     * @since                   1.0
     */
    public List<CustomerRegistry> getListOfCustomers() {
        Session session = HibernateUtil.getSession();
        List<CustomerRegistry> customerList = null;
        try {
            customerList = (List<CustomerRegistry>) session.createCriteria(CustomerRegistry.class).list();
        } catch (HibernateException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            HibernateUtil.closeSession(session);
        }

        return customerList;
    }

    /** 
     * Gets the number of customers in the database.
     *
     * @return                  the number of customers.
     * @see                     CustomerRegistry
     * @since                   1.0
     */
    public int getNumOfCustomers() {
        return getListOfCustomers().size();
    }

    /** 
     * Gets all existing customers' names.
     *
     * @return                  an array containing the names of all customers.
     * @see                     CustomerRegistry
     * @since                   1.0
     */
    public String[] getCustomersNames() {
        List<CustomerRegistry> customerList = getListOfCustomers();
        String[] names = new String[customerList.size()];

        for (int i = 0; i < customerList.size(); i++) {
            names[i] = customerList.get(i).getName();
        }

        return names;
    }

    /** 
     * Gets a list of all virtual machines deployed by a given customer.
     *
     * @param   customerId      the id of the customer of which the virtual
     *                          machines will be listed.
     * @return                  a list containing all the virtual machines
     *                          deployed by the customer; <code>null</code> 
     *                          if no virtual machines were found.
     * @see                     CustomerRegistry
     * @see                     VirtualMachineRegistry
     * @since                   1.0
     */
    public List<VirtualMachineRegistry> getListOfVms(long customerId) {
        Session session = HibernateUtil.getSession();
        CustomerRegistry customer = null;
        try {
            customer = (CustomerRegistry) session.createCriteria(CustomerRegistry.class)
                    .add(Restrictions.eq("id", customerId)).uniqueResult();
        } catch (HibernateException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            HibernateUtil.closeSession(session);
        }

        return customer.getVmList();
    }

    /** 
     * Gets a virtual machine registry based on its id and the id of the
     * customer who owns it.
     * 
     * @param   vmId            the id of the virtual machine to be retrieved.
     * @param   customerId      the id of the customer who owns the virtual
     *                          machine to be retrieved.
     * @return                  the virtual machine registry, if it exists; 
     *                          <code>null</code> otherwise.
     * @see                     CustomerRegistry
     * @see                     VirtualMachineRegistry
     * @since                   1.0
     */
    public VirtualMachineRegistry getVirtualMachineRegistry(long vmId, long customerId) {
        Session session = HibernateUtil.getSession();
        CustomerRegistry customer = null;
        try {
            customer = (CustomerRegistry) session.createCriteria(CustomerRegistry.class)
                    .add(Restrictions.eq("id", customerId)).uniqueResult();
        } catch (HibernateException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            HibernateUtil.closeSession(session);
        }

        VirtualMachineRegistry vm = null;
        for (VirtualMachineRegistry vr : customer.getVmList()) {
            if (vr.getId() == vmId) {
                vm = vr;
                break;
            }
        }

        return vm;
    }

    /** 
     * Gets the number of virtual machines deployed by a given customer.
     * 
     * @param   customerId      the id of the customer who owns the virtual
     *                          machines to be counted.
     * @return                  the number of virtual machines deployed by
     *                          the customer.
     * @see                     CustomerRegistry
     * @see                     VirtualMachineRegistry
     * @since                   1.0
     */
    public int getNumOfVms(long customerId) {
        int numOfVms = 0;
        for (VirtualMachineRegistry vm : getListOfVms(customerId)) {
            numOfVms += vm.getAmount();
        }
        return numOfVms;
    }

    /** 
     * Gets the names of all virtual machines deployed by a given customer.
     * 
     * @param   customerId      the id of the customer who owns the virtual
     *                          machines.
     * @return                  an array containing the names of all virtual
     *                          machines deployed by the customer.
     * @see                     CustomerRegistry
     * @see                     VirtualMachineRegistry
     * @since                   1.0
     */
    public String[] getNamesOfVms(long customerId) {
        int n = getNumOfVms(customerId);

        String[] names = new String[n];

        for (int i = 0; i < n; i++) {
            names[i] = "VM" + i;
        }

        return names;
    }

    /** 
     * Gets the total demand of RAM from the virtual machines deployed by
     * a given customer.
     * 
     * @param   customerId      the id of the customer who owns the virtual
     *                          machines.
     * @return                  the total demand of RAM from all virtual
     *                          machines deployed by the customer.
     * @see                     CustomerRegistry
     * @see                     VirtualMachineRegistry
     * @since                   1.0
     */
    public long getRamDemand(long customerId) {
        long sum = 0;
        for (VirtualMachineRegistry vmr : getListOfVms(customerId)) {
            sum += LongOperations.saturatedAdd(sum, (vmr.getRam() * vmr.getAmount()));
        }

        return sum;
    }

    /** 
     * Gets the total demand of bandwidth from the virtual machines deployed by
     * a given customer.
     * 
     * @param   customerId      the id of the customer who owns the virtual
     *                          machines.
     * @return                  the total demand of bandwidth from all virtual
     *                          machines deployed by the customer.
     * @see                     CustomerRegistry
     * @see                     VirtualMachineRegistry
     * @since                   1.0
     */
    public long getBwDemand(long customerId) {
        long sum = 0;

        for (VirtualMachineRegistry vmr : getListOfVms(customerId)) {
            sum += LongOperations.saturatedAdd(sum, (vmr.getBw() * vmr.getAmount()));
        }

        return sum;
    }

    /** 
     * Gets the total demand of MIPS from the virtual machines deployed by
     * a given customer.
     * 
     * @param   customerId      the id of the customer who owns the virtual
     *                          machines.
     * @return                  the total demand of MIPS from all virtual
     *                          machines deployed by the customer.
     * @see                     CustomerRegistry
     * @see                     VirtualMachineRegistry
     * @since                   1.0
     */
    public long getMipsDemand(long customerId) {
        long sum = 0;

        for (VirtualMachineRegistry vmr : getListOfVms(customerId)) {
            String s = Double.toString(vmr.getMips()).split("\\.")[0];
            Long mips = Long.valueOf(s);
            sum += LongOperations.saturatedAdd(sum, (mips * vmr.getAmount()));
        }

        return sum;
    }

    /** 
     * Gets the total demand of storage from the virtual machines deployed by
     * a given customer.
     * 
     * @param   customerId      the id of the customer who owns the virtual
     *                          machines.
     * @return                  the total demand of storage from all virtual
     *                          machines deployed by the customer.
     * @see                     CustomerRegistry
     * @see                     VirtualMachineRegistry
     * @since                   1.0
     */
    public long getStorageDemand(long customerId) {
        long sum = 0;

        for (VirtualMachineRegistry vmr : getListOfVms(customerId)) {
            sum += LongOperations.saturatedAdd(sum, vmr.getSize() * vmr.getAmount());
        }

        return sum;
    }

    /** 
     * Gets the number of cloudlets created by all customers.
     * 
     * @return                  the total number of cloudlets created by
     *                          all customers.
     * @see                     CustomerRegistry
     * @see                     UtilizationProfile
     * @since                   1.0
     */
    public long getTotalNumOfCloudlets() {
        long numOfCloudlets = 0;

        for (CustomerRegistry c : getListOfCustomers()) {
            numOfCloudlets += c.getUtilizationProfile().getNumOfCloudlets();
        }

        return numOfCloudlets;
    }

    /** 
     * Gets the total number of virtual machines deployed by all customers.
     * 
     * @return                  the total number of virtual machines deployed by
     *                          all customers.
     * @see                     CustomerRegistry
     * @see                     UtilizationProfile
     * @since                   1.0
     */
    public long getTotalNumOfVms() {
        long numOfVms = 0;

        for (CustomerRegistry c : getListOfCustomers()) {
            numOfVms = LongOperations.saturatedAdd(numOfVms, new CustomerRegistryDAO().getNumOfVms(c.getId()));
        }

        return numOfVms;
    }

    /** 
     * Gets the average length of cloudlets created by all customers.
     * 
     * @return                  the average length of cloudlets created by
     *                          all customers.
     * @see                     CustomerRegistry
     * @see                     UtilizationProfile
     * @since                   1.0
     */
    public long getAvgLength() {
        int numOfCostumers = getNumOfCustomers();
        long[] avgArray = new long[numOfCostumers];
        long longSum = 0;

        int i = 0;
        for (CustomerRegistry c : getListOfCustomers()) {
            avgArray[i] = c.getUtilizationProfile().getLength();
            i++;
        }

        for (i = 0; i < avgArray.length; i++) {
            longSum = LongOperations.saturatedAdd(longSum, avgArray[i]);
        }

        return longSum / numOfCostumers;
    }

    /** 
     * Gets the average file size of cloudlets created by all customers.
     * 
     * @return                  the average file size of cloudlets created by
     *                          all customers.
     * @see                     CustomerRegistry
     * @see                     UtilizationProfile
     * @since                   1.0
     */
    public long getAvgFileSize() {
        int numOfCostumers = getNumOfCustomers();
        long[] avgArray = new long[numOfCostumers];
        long longSum = 0;

        int i = 0;
        for (CustomerRegistry c : getListOfCustomers()) {
            avgArray[i] = c.getUtilizationProfile().getFileSize();
            i++;
        }

        for (i = 0; i < avgArray.length; i++) {
            longSum = LongOperations.saturatedAdd(longSum, avgArray[i]);
        }

        return longSum / numOfCostumers;
    }

    /** 
     * Gets the average output size of cloudlets created by all customers.
     * 
     * @return                  the average output size of cloudlets created by
     *                          all customers.
     * @see                     CustomerRegistry
     * @see                     UtilizationProfile
     * @since                   1.0
     */
    public long getAvgOutputSize() {
        int numOfCostumers = getNumOfCustomers();
        long[] avgArray = new long[numOfCostumers];
        long longSum = 0;

        int i = 0;
        for (CustomerRegistry c : getListOfCustomers()) {
            avgArray[i] = c.getUtilizationProfile().getOutputSize();
            i++;
        }

        for (i = 0; i < avgArray.length; i++) {
            longSum = LongOperations.saturatedAdd(longSum, avgArray[i]);
        }

        return longSum / numOfCostumers;
    }

    /** 
     * Gets the average image size of virtual machines deployed by all 
     * customers.
     * 
     * @return                  the average image size of virtual machines
     *                          deployed by all customers.
     * @see                     CustomerRegistry
     * @see                     VirtualMachineRegistry
     * @since                   1.0
     */
    public long getAvgImageSize() {
        long sum = 0;

        for (CustomerRegistry c : getListOfCustomers()) {
            for (VirtualMachineRegistry vmr : c.getVmList()) {
                sum = LongOperations.saturatedAdd(sum, vmr.getSize() * vmr.getAmount());
            }
        }

        return sum / getTotalNumOfVms();
    }

    /** 
     * Gets the average amount of RAM requested by all virtual machines
     * deployed by all customers.
     * 
     * @return                  the average amount of RAM requested by all
     *                          virtual machines.
     * @see                     CustomerRegistry
     * @see                     UtilizationProfile
     * @since                   1.0
     */
    public long getAvgRAM() {
        long sum = 0;

        for (CustomerRegistry c : getListOfCustomers()) {
            for (VirtualMachineRegistry vmr : c.getVmList()) {
                sum = LongOperations.saturatedAdd(sum, vmr.getRam() * vmr.getAmount());
            }
        }

        return sum / getTotalNumOfVms();
    }

    /** 
     * Gets the average amount of bandwidth requested by all virtual machines
     * deployed by all customers.
     * 
     * @return                  the average amount of bandwidth requested by all
     *                          virtual machines.
     * @see                     CustomerRegistry
     * @see                     UtilizationProfile
     * @since                   1.0
     */
    public long getAvgBw() {
        long sum = 0;

        for (CustomerRegistry c : getListOfCustomers()) {
            for (VirtualMachineRegistry vmr : c.getVmList()) {
                sum = LongOperations.saturatedAdd(sum, vmr.getBw() * vmr.getAmount());
            }
        }

        return sum / getTotalNumOfVms();
    }

}