Package com.abiquo.server.core.infrastructure.network

Source Code of com.abiquo.server.core.infrastructure.network.IpPoolManagementDAO

/**
* Copyright (C) 2008 - Abiquo Holdings S.L. All rights reserved.
*
* Please see /opt/abiquo/tomcat/webapps/legal/ on Abiquo server
* or contact contact@abiquo.com for licensing information.
*/
package com.abiquo.server.core.infrastructure.network;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.abiquo.model.enumerator.NetworkType;
import com.abiquo.server.core.cloud.VirtualAppliance;
import com.abiquo.server.core.cloud.VirtualMachine;
import com.abiquo.server.core.common.persistence.DefaultDAOBase;
import com.abiquo.server.core.infrastructure.management.RasdManagement;
import com.abiquo.server.core.infrastructure.network.IpPoolManagement.OrderByEnum;
import com.abiquo.server.core.util.PagedList;
import com.softwarementors.bzngine.entities.PersistentEntity;

@Repository("jpaIpPoolManagementDAO")
@SuppressWarnings("unchecked")
public class IpPoolManagementDAO extends DefaultDAOBase<Integer, IpPoolManagement>
{

    // public static final String BY_DATACENTER = " SELECT ip FROM "
    // + "Datacenter dc INNER JOIN dc.network net, VLANNetwork vlan "
    // + "INNER JOIN vlan.configuration conf INNER JOIN conf.dhcp dhcp, "
    // + "IpPoolManagement ip LEFT JOIN ip.virtualMachine vm LEFT JOIN ip.virtualAppliance vapp "
    // + "LEFT JOIN ip.virtualDatacenter vdc JOIN vdc.enterprise ent "
    // + "WHERE net.id = vlan.network.id AND dhcp.id = ip.dhcp.id AND dc.id = :datacenter_id";

    public static final String BY_DATACENTER =
        " SELECT ip FROM "
            + "Datacenter dc INNER JOIN dc.network net, VLANNetwork vlan "
            + "INNER JOIN vlan.configuration conf, "
            // "INNER JOIN conf.dhcp dhcp, "
            + "IpPoolManagement ip LEFT JOIN ip.virtualMachine vm LEFT JOIN ip.virtualAppliance vapp "
            + "LEFT JOIN ip.virtualDatacenter vdc LEFT JOIN vlan.enterprise ent "
            + "WHERE net.id = vlan.network.id "
            // +"AND dhcp.id = ip.dhcp.id"
            + "AND ip.vlanNetwork.id = vlan.id "
            + " AND dc.id = :datacenter_id AND "
            + "( ip.ip LIKE :filterLike OR ip.mac LIKE :filterLike OR ip.networkName LIKE :filterLike OR "
            + " vm.name like :filterLike OR vapp.name LIKE :filterLike OR ent.name LIKE :filterLike )"
            + "AND ip.temporal is null";//

    public static final String BY_DATACENTER_AND_ENTERPRISE =
        " SELECT ip FROM "
            + "Datacenter dc INNER JOIN dc.network net, VLANNetwork vlan "
            + "INNER JOIN vlan.configuration conf, "
            // "INNER JOIN conf.dhcp dhcp, "
            + "IpPoolManagement ip LEFT JOIN ip.virtualMachine vm LEFT JOIN ip.virtualAppliance vapp "
            + "LEFT JOIN ip.virtualDatacenter vdc LEFT JOIN vlan.enterprise ent "
            + "WHERE net.id = vlan.network.id "
            + "AND ip.vlanNetwork.id = vlan.id "
            + " AND dc.id = :datacenter_id AND "
            + "( ip.ip LIKE :filterLike OR ip.mac LIKE :filterLike OR ip.networkName LIKE :filterLike OR "
            + " vm.name like :filterLike OR vapp.name LIKE :filterLike OR ent.name LIKE :filterLike )";//

    public static final String BY_DEFAULT_VLAN_USED_BY_ANY_VDC =
        " SELECT vlan_network_id FROM  virtualdatacenter vdc, vlan_network vl where "
            + "vdc.default_vlan_network_id=vl.vlan_network_id and vdc.default_vlan_network_id=:vlan_id";

    public static final String BY_ENT = " SELECT ip FROM IpPoolManagement ip "
        + " left join ip.virtualMachine vm " + " left join ip.virtualAppliance vapp, "
        + " NetworkConfiguration nc, " + " VirtualDatacenter vdc, " + " VLANNetwork vn, "
        + " Enterprise ent " + "WHERE ip.vlanNetwork.id = vn.id "
        + " AND nc.id = vn.configuration.id " + " AND vn.network.id = vdc.network.id"
        + " AND vdc.enterprise.id = ent.id" + " AND ent.id = :ent_id " + " AND "
        + "( ip.ip like :filterLike " + " OR ip.mac like :filterLike "
        + " OR ip.vlanNetwork.name like :filterLike " + " OR vapp.name like :filterLike "
        + " OR vm.name like :filterLike " + ")";

    public static final String BY_EXTERNAL_VLAN = "SELECT ip FROM IpPoolManagement ip "
        + " left join ip.virtualMachine vm " + " left join ip.virtualAppliance vapp "
        + " left join ip.virtualDatacenter vdc, " + " NetworkConfiguration nc, "
        + " VLANNetwork vn " + " join vn.enterprise ent, " + " DatacenterLimits dcl"
        + " WHERE ip.vlanNetwork.id = vn.id " + " AND nc.id = vn.configuration.id "
        + " AND vn.id = :vlan_id " + " AND ent.id = :ent_id AND "
        + " dcl.enterprise.id = ent.id AND " + " ip.available = 1   AND "
        + " dcl.id = :dc_limit_id AND " + "( ip.ip like :filterLike "
        + " OR ip.mac like :filterLike " + " OR ip.vlanNetwork.name like :filterLike "
        + " OR vapp.name like :filterLike " + " OR vm.name like :filterLike " + ")"
        + " AND ip.temporal is null";

    public static final String BY_IP_PURCHASED = " SELECT ip FROM "
        + "Datacenter dc INNER JOIN dc.network net, VLANNetwork vlan "
        + "INNER JOIN vlan.configuration conf,"
        + "IpPoolManagement ip LEFT JOIN ip.virtualMachine vm LEFT JOIN ip.virtualAppliance vapp, "
        + "VirtualDatacenter vdc LEFT JOIN vdc.enterprise ent " + "WHERE net.id = vlan.network.id "
        + "AND ip.vlanNetwork.id = vlan.id " + "AND vdc.id = :vdc_id AND "
        + "vdc.datacenter.id = dc.id AND ip.id = :ip_id AND "
        + "ip.available = 1 AND vlan.enterprise is null AND ip.virtualDatacenter.id = :vdc_id";

    public static final String BY_IP_TO_PURCHASE = " SELECT ip FROM "
        + "Datacenter dc INNER JOIN dc.network net, VLANNetwork vlan "
        + "INNER JOIN vlan.configuration conf,"
        // +" INNER JOIN conf.dhcp dhcp, "
        + "IpPoolManagement ip LEFT JOIN ip.virtualMachine vm LEFT JOIN ip.virtualAppliance vapp, "
        + "VirtualDatacenter vdc LEFT JOIN vdc.enterprise ent "
        + "WHERE net.id = vlan.network.id "
        // +"AND dhcp.id = ip.dhcp.id "
        + "AND ip.vlanNetwork.id = vlan.id " + "AND vdc.id = :vdc_id AND "
        + "vdc.datacenter.id = dc.id AND ip.id = :ip_id AND "
        + "ip.available = 1 AND vlan.enterprise is null AND ip.virtualDatacenter is null";

    public static final String BY_NETWORK = " SELECT ip FROM IpPoolManagement ip "
        + " left join ip.virtualMachine vm "
        + " left join ip.virtualAppliance vapp, "
        + " NetworkConfiguration nc, "
        + " VLANNetwork vn "
        // + " WHERE ip.dhcp.id = nc.dhcp.id "
        + "WHERE ip.vlanNetwork.id = vn.id " + " AND nc.id = vn.configuration.id "
        + " AND vn.id = :vlan_id " + " AND vn.network.id = :net_id AND "
        + "( ip.ip like :filterLike " + " OR ip.mac like :filterLike "
        + " OR ip.vlanNetwork.name like :filterLike " + " OR vapp.name like :filterLike "
        + " OR vm.name like :filterLike " + ")";

    public static final String BY_PUBLIC_VLAN =
        " SELECT ip FROM "
            + "Datacenter dc INNER JOIN dc.network net, VLANNetwork vlan "
            + "INNER JOIN vlan.configuration conf,"
            // +" INNER JOIN conf.dhcp dhcp, "
            + "IpPoolManagement ip LEFT JOIN ip.virtualDatacenter vdc LEFT JOIN ip.virtualAppliance vapp "
            + "LEFT JOIN ip.virtualMachine vm LEFT JOIN vdc.enterprise ent "
            + "WHERE net.id = vlan.network.id"
            // +"AND dhcp.id = ip.dhcp.id "
            + " AND ip.vlanNetwork.id = vlan.id "
            + " AND dc.id = :datacenter_id AND "
            + "vlan.id = :vlan_id AND"
            + "( ip.ip LIKE :filterLike OR ip.mac LIKE :filterLike OR ip.networkName LIKE :filterLike OR "
            + " vm.name like :filterLike OR vapp.name LIKE :filterLike OR ent.name LIKE :filterLike ) "
            + " AND ip.temporal is null";

    public static final String BY_VDC = " SELECT ip FROM IpPoolManagement ip "
        + " left join ip.virtualMachine vm "
        + " left join ip.virtualAppliance vapp, "
        + " NetworkConfiguration nc, "
        + " VirtualDatacenter vdc, "
        + " VLANNetwork vn "
        // + " WHERE ip.dhcp.id = nc.dhcp.id "
        + "WHERE ip.vlanNetwork.id = vn.id " + " AND nc.id = vn.configuration.id "
        + " AND vn.network.id = vdc.network.id" + " AND vdc.id = :vdc_id AND"
        + "( ip.ip like :filterLike " + " OR ip.mac like :filterLike "
        + " OR ip.vlanNetwork.name like :filterLike " + " OR vapp.name like :filterLike "
        + " OR vm.name like :filterLike " + ")" + " AND ip.temporal is null";//

    public static final String BY_VDC_PURCHASED =
        " SELECT ip FROM "
            + "Datacenter dc INNER JOIN dc.network net, VLANNetwork vlan "
            + "INNER JOIN vlan.configuration conf,"
            // +" INNER JOIN conf.dhcp dhcp, "
            + "IpPoolManagement ip LEFT JOIN ip.virtualMachine vm LEFT JOIN ip.virtualAppliance vapp, "
            + "VirtualDatacenter vdc LEFT JOIN vdc.enterprise ent "
            + "WHERE net.id = vlan.network.id "
            // +"AND dhcp.id = ip.dhcp.id "
            + "AND ip.vlanNetwork.id = vlan.id "
            + "AND vdc.id = :vdc_id AND "
            + "vdc.datacenter.id = dc.id AND "
            + "ip.available = 1 AND vlan.enterprise is null AND ip.virtualDatacenter.id = :vdc_id AND "
            + "( ip.ip LIKE :filterLike OR ip.mac LIKE :filterLike OR ip.networkName LIKE :filterLike OR "
            + " vm.name like :filterLike OR vapp.name LIKE :filterLike OR ent.name LIKE :filterLike ) "
            + "AND ip.temporal is null";

    public static final String BY_PUBLIC_VLAN_AND_PURCHASED =
        " SELECT ip FROM "
            + "Datacenter dc INNER JOIN dc.network net, VLANNetwork vlan "
            + "INNER JOIN vlan.configuration conf,"
            + "IpPoolManagement ip LEFT JOIN ip.virtualMachine vm LEFT JOIN ip.virtualAppliance vapp, "
            + "VirtualDatacenter vdc LEFT JOIN vdc.enterprise ent "
            + "WHERE net.id = vlan.network.id "
            + "AND vlan.id = :vlan_id "
            + "AND ip.vlanNetwork.id = vlan.id "
            + "AND vdc.id = :vdc_id "
            + "AND vdc.datacenter.id = dc.id  "
            + "AND ip.available = 1 AND vlan.enterprise is null AND ip.virtualDatacenter.id = :vdc_id "
            + "AND ip.ip NOT in ( :excludedIp ) "
            + "AND ( ip.ip LIKE :filterLike OR ip.mac LIKE :filterLike OR ip.networkName LIKE :filterLike OR "
            + "vm.name like :filterLike OR vapp.name LIKE :filterLike OR ent.name LIKE :filterLike )";

    public static final String BY_VDC_TO_PURCHASE =
        " SELECT ip FROM "
            + "Datacenter dc INNER JOIN dc.network net, VLANNetwork vlan "
            + "INNER JOIN vlan.configuration conf,"
            // +" INNER JOIN conf.dhcp dhcp, "
            + "IpPoolManagement ip LEFT JOIN ip.virtualMachine vm LEFT JOIN ip.virtualAppliance vapp, "
            + "VirtualDatacenter vdc LEFT JOIN vdc.enterprise ent "
            + "WHERE net.id = vlan.network.id "
            // +"AND dhcp.id = ip.dhcp.id "
            + "AND ip.vlanNetwork.id = vlan.id "
            + "AND vdc.id = :vdc_id AND "
            + "vdc.datacenter.id = dc.id AND "
            + "ip.available = 1 AND ip.quarantine = 0  AND vlan.enterprise is null AND ip.virtualDatacenter is null AND "
            + "( ip.ip LIKE :filterLike OR ip.mac LIKE :filterLike OR ip.networkName LIKE :filterLike OR "
            + " vm.name like :filterLike OR vapp.name LIKE :filterLike OR ent.name LIKE :filterLike )";

    public static final String BY_VLAN_NEXT_PUBLIC_AVAILABLE =
        " SELECT ip FROM IpPoolManagement ip " + " inner join ip.vlanNetwork vn "
            + " WHERE vn.id = :vlan_id " + " AND ip.virtualMachine is null "
            + " AND ip.ip NOT in ( :excludedIp ) "
            + " AND ip.mac is not null AND ip.available = 1 AND ip.quarantine = 0";

    public static final String BY_VIRTUAL_MACHINE = "SELECT ip "
        + "FROM IpPoolManagement ip INNER JOIN ip.virtualMachine vm " + "WHERE vm.id = :vm_id "
        + "ORDER BY ip.sequence";

    public static final String BY_VLAN = " SELECT ip FROM IpPoolManagement ip "
        + " left join ip.virtualMachine vm "
        + " left join ip.virtualAppliance vapp, "
        + " NetworkConfiguration nc, "
        + " VirtualDatacenter vdc, "
        + " VLANNetwork vn "
        // + " WHERE ip.dhcp.id = nc.dhcp.id "
        + "WHERE ip.vlanNetwork.id = vn.id " + " AND nc.id = vn.configuration.id "
        + " AND vn.id = :vlan_id " + " AND vn.network.id = vdc.network.id"
        + " AND vdc.id = :vdc_id AND" + "( ip.ip like :filterLike "
        + " OR ip.mac like :filterLike " + " OR ip.vlanNetwork.name like :filterLike "
        + " OR vapp.name like :filterLike " + " OR vm.name like :filterLike " + ")"
        + " AND ip.temporal is null";

    public static final String BY_VLAN_NEXT_AVAILABLE = " SELECT ip FROM IpPoolManagement ip "
        + " inner join ip.vlanNetwork vn " + " WHERE vn.id = :vlan_id "
        + " AND ip.virtualMachine is null " + " AND ip.ip NOT in ( :excludedIp ) ";

    public static final String BY_VLAN_NEXT_EXTERNAL_IP_AVAILABLE =
        " SELECT ip FROM IpPoolManagement ip " + " inner join ip.vlanNetwork vn "
            + " WHERE vn.id = :vlan_id " + " AND ip.virtualMachine is null "
            + " AND ip.ip NOT in ( :excludedIp ) " + " AND ip.available = 1 AND ip.quarantine = 0";

    public static final String BY_VLAN_USED_BY_ANY_VDC =
        " SELECT ip FROM ip_pool_management ip  , rasd_management rasd, virtualdatacenter vdc "
            + "  WHERE ip.idManagement= rasd.idManagement and rasd.idVirtualDatacenter "
            + "= vdc.idVirtualDatacenter and ip.vlan_network_id =:vlan_id";

    public static final String BY_VLAN_USED_BY_ANY_VM = " SELECT ip FROM IpPoolManagement ip "
        + " left join ip.virtualMachine vm "
        + " left join ip.virtualAppliance vapp, "
        + " NetworkConfiguration nc, "
        + " VLANNetwork vn "
        // + " WHERE ip.dhcp.id = nc.dhcp.id "
        + "WHERE ip.vlanNetwork.id = vn.id " + " AND nc.id = vn.configuration.id "
        + " AND vn.id = :vlan_id " + " AND ( ip.ip like :filterLike "
        + " OR ip.mac like :filterLike " + " OR ip.vlanNetwork.name like :filterLike "
        + " OR vapp.name like :filterLike " + " OR vm.name like :filterLike " + ")";

    public static final String BY_VLAN_WITHOUT_USED_IPS = " SELECT ip FROM IpPoolManagement ip "
        + " left join ip.virtualMachine vm "
        + " left join ip.virtualAppliance vapp, "
        + " NetworkConfiguration nc, "
        + " VirtualDatacenter vdc, "
        + " VLANNetwork vn "
        // + " WHERE ip.dhcp.id = nc.dhcp.id "
        + "WHERE ip.vlanNetwork.id = vn.id " + " AND nc.id = vn.configuration.id "
        + " AND vn.id = :vlan_id " + " AND vn.network.id = vdc.network.id"
        + " AND vdc.id = :vdc_id " + " AND vm is null AND " + "( ip.ip like :filterLike "
        + " OR ip.mac like :filterLike " + " OR ip.vlanNetwork.name like :filterLike "
        + " OR vapp.name like :filterLike " + " OR vm.name like :filterLike " + ")";

    private static final String GET_VLAN_ASSIGNED_TO_ANOTHER_VIRTUALMACHINE = "Select vm "
        + "FROM com.abiquo.server.core.infrastructure.network.IpPoolManagement ip "
        + "INNER JOIN ip.virtualMachine vm " + "INNER JOIN ip.vlanNetwork vlan "
        + "WHERE vlan.id = :idVlan " + "AND vm.id != :idVm " + "AND vm.state != 'NOT_ALLOCATED'";

    private final static String GET_NETWORK_POOL_PURCHASED_BY_ENTERPRISE = "SELECT ip "//
        + "FROM com.abiquo.server.core.infrastructure.Datacenter dc "//
        + "INNER JOIN dc.network net, "//
        + "com.abiquo.server.core.infrastructure.network.VLANNetwork vlan, "//
        // + "INNER JOIN vlan.configuration.dhcp dhcp, "//
        + "com.abiquo.server.core.infrastructure.network.IpPoolManagement ip "//
        // + "LEFT JOIN join ip.virtualMachine vm "//
        + "LEFT JOIN ip.virtualAppliance vapp, "//
        + "com.abiquo.server.core.cloud.VirtualDatacenter vdc "//
        + "where net.id = vlan.network.id "//
        // + "and dhcp.id = ip.dhcp.id "//
        + "and ip.vlanNetwork.id = vlan.id "
        + "and dc.id = vdc.datacenter.id "//
        + "and vdc.enterprise.id = :enterpriseId "
        + "and ip.virtualDatacenter.id = vdc.id "
        + "and vlan.type = 'PUBLIC'";

    public static final String GET_IP_INTO_VIRTUALMACHINE = " SELECT ip FROM IpPoolManagement ip"
        + " WHERE ip.virtualMachine.id = :idVm " + " AND ip.id = :idIp ";

    private static Criterion equalMac(final String mac)
    {
        assert !StringUtils.isEmpty(mac);

        return Restrictions.eq(IpPoolManagement.MAC_PROPERTY, mac);
    }

    public IpPoolManagementDAO()
    {
        super(IpPoolManagement.class);
    }

    public IpPoolManagementDAO(final EntityManager entityManager)
    {
        super(IpPoolManagement.class, entityManager);
    }

    public boolean existsAnyWithMac(final String mac)
    {
        assert !StringUtils.isEmpty(mac);

        return this.existsAnyByCriterions(equalMac(mac));
    }

    public List<IpPoolManagement> findDeployedIpsByPrivateVLAN(final Integer vlanId)
    {
        Query finalQuery =
            getSession().createQuery(BY_VLAN_USED_BY_ANY_VM + " " + defineFilterDeployed());

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("vlan_id", vlanId);
        params.put("filterLike", "%");
        finalQuery.setProperties(params);

        Integer totalResults = count(finalQuery, params).intValue();

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);

        return ipList;
    }

    public List<IpPoolManagement> findExternalIpsByVlan(final Integer entId,
        final Integer datacenterLimitId, final Integer vlanId, Integer startwith, Integer limit,
        final String filter, final OrderByEnum orderByEnum, final Boolean descOrAsc,
        final Boolean onlyAvailable)
    {
        Query finalQuery =
            getSession().createQuery(
                BY_EXTERNAL_VLAN + " " + defineOnlyAvailableFilterExternal(onlyAvailable)
                    + defineOrderBy(orderByEnum, descOrAsc));

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("ent_id", entId);
        params.put("dc_limit_id", datacenterLimitId);
        params.put("vlan_id", vlanId);
        params.put("filterLike", filter == null || filter.isEmpty() ? "%" : "%" + filter + "%");
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        // Limit 0 means no size filter
        if (limit == 0)
        {
            limit = totalResults;
            startwith = 0;
        }
        else if (startwith >= totalResults)
        {
            startwith = totalResults - limit;
        }

        finalQuery.setFirstResult(startwith);
        finalQuery.setMaxResults(limit);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(limit);
        ipList.setCurrentElement(startwith);

        return ipList;
    }

    public List<IpPoolManagement> findFreeIpsByVlan(final VLANNetwork vlan)
    {
        Criterion freeIps = Restrictions.eq(IpPoolManagement.VLAN_NETWORK_PROPERTY, vlan);
        Criteria criteria = getSession().createCriteria(IpPoolManagement.class).add(freeIps);
        criteria.add(Restrictions.isNull(IpPoolManagement.MAC_PROPERTY));
        return criteria.list();
    }

    /**
     * Return a single {@link IpPoolManagement}
     *
     * @param vlan {@link VLANNetwork} oject which the Ip should belong to.
     * @param ipId identifier of the Ip.
     * @return the found object.
     */
    public IpPoolManagement findIp(final VLANNetwork vlan, final Integer ipId)
    {
        Criteria criteria = getSession().createCriteria(IpPoolManagement.class);
        Criterion vlanEqual = Restrictions.eq(IpPoolManagement.VLAN_NETWORK_PROPERTY, vlan);
        Criterion ipEqual = Restrictions.eq(PersistentEntity.ID_PROPERTY, ipId);

        criteria.add(vlanEqual).add(ipEqual);

        return (IpPoolManagement) criteria.uniqueResult();
    }

    public IpPoolManagement findIpByVirtualMachine(final VirtualMachine vm, final Integer nicId)
    {
        Query finalQuery = getSession().createQuery(GET_IP_INTO_VIRTUALMACHINE);
        finalQuery.setParameter("idVm", vm.getId());
        finalQuery.setParameter("idIp", nicId);

        return (IpPoolManagement) finalQuery.uniqueResult();
    }

    public List<IpPoolManagement> findIpsByEnterprise(final Integer entId, Integer firstElem,
        final Integer numElem, final String has, final IpPoolManagement.OrderByEnum orderby,
        final Boolean asc)
    {
        // Get the query that counts the total results.
        Query finalQuery = getSession().createQuery(BY_ENT + " " + defineOrderBy(orderby, asc));

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("ent_id", entId);
        params.put("filterLike", has.isEmpty() ? "%" : "%" + has + "%");
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();
        if (firstElem >= totalResults)
        {
            firstElem = totalResults - numElem;
        }

        // Get the list of elements
        finalQuery.setFirstResult(firstElem);
        finalQuery.setMaxResults(numElem);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(numElem);
        ipList.setCurrentElement(firstElem);

        return ipList;
    }

    /**
     * Return all the IPs from a VLAN.
     *
     * @param network {@link Network} network entity that stores all the VLANs
     * @param vlanId identifier of the VLAN to search into.
     * @return all the {@link IpPoolManagement} ips.
     */
    public List<IpPoolManagement> findIpsByNetwork(final Network network, final Integer vlanId)
    {
        return findIpsByNetwork(network, vlanId, null);
    }

    /**
     * Return all the IPs from a VLAN filtered by a string
     *
     * @param network {@link Network} network entity that stores all the VLANs
     * @param vlanId identifier of the VLAN to search into.
     * @param has to filter the search
     * @return all the {@link IpPoolManagement} ips.
     */
    public List<IpPoolManagement> findIpsByNetwork(final Network network, final Integer vlanId,
        final String has)
    {
        return findIpsByNetwork(network, vlanId, has, 0, null);
    }

    /**
     * Return all the IPs from a VLAN filtered by a string and saying how many elements do you want
     * and the first element to retrieve
     *
     * @param network {@link Network} network entity that stores all the VLANs
     * @param vlanId identifier of the VLAN to search into.
     * @param has to filter the search
     * @param firstElem firstelement to retrieve.
     * @param numeElem to retrieve.
     * @return all the {@link IpPoolManagement} ips.
     */
    public List<IpPoolManagement> findIpsByNetwork(final Network network, final Integer vlanId,
        final String has, Integer firstElem, final Integer numElem)
    {
        Query finalQuery = getSession().createQuery(BY_NETWORK);

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("net_id", network.getId());
        params.put("vlan_id", vlanId);
        params.put("filterLike", has == null || has.isEmpty() ? "%" : "%" + has + "%");
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        if (numElem != null)
        {
            finalQuery.setMaxResults(numElem);
        }

        if (firstElem >= totalResults)
        {
            firstElem = totalResults - 1;
            finalQuery.setMaxResults(1);
        }
        finalQuery.setFirstResult(firstElem);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(numElem);
        ipList.setCurrentElement(firstElem);

        return ipList;
    }

    /**
     * Return the {@link PagedList} entity with the Ips by VLAN.
     *
     * @param vdcId virtual datacenter id
     * @param vlanId vlan id
     * @return list of used IpPoolManagement.
     */
    public List<IpPoolManagement> findIpsByPrivateVLAN(final Integer vdcId, final Integer vlanId)
    {

        Query finalQuery = getSession().createQuery(BY_VLAN);

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("vdc_id", vdcId);
        params.put("vlan_id", vlanId);
        params.put("filterLike", "%");
        finalQuery.setProperties(params);

        Integer totalResults = count(finalQuery, params).intValue();

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);

        return ipList;

    }

    /**
     * Find all the IpPoolManagement created and available by a vLAN with filter options
     *
     * @param vdcId identifier of the virtual datacenter.
     * @param vlanId identifier of the vlan.
     * @param firstElem first element to retrieve.
     * @param numElem number of elements to retrieve.
     * @param has filter %like%
     * @param orderby ordering filter. {@see IpPoolManagement.OrderByEnum}
     * @param asc ordering filter, ascending = true, descending = false.
     * @return List of IP addresses that pass the filter.
     */
    public List<IpPoolManagement> findIpsByPrivateVLANAvailableFiltered(final Integer vdcId,
        final Integer vlanId, Integer firstElem, final Integer numElem, final String has,
        final IpPoolManagement.OrderByEnum orderby, final Boolean asc)
    {
        // Get the query that counts the total results.
        Query finalQuery =
            getSession().createQuery(
                BY_VLAN + " " + defineFilterAvailable() + defineOrderBy(orderby, asc));

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("vdc_id", vdcId);
        params.put("vlan_id", vlanId);
        params.put("filterLike", has.isEmpty() ? "%" : "%" + has + "%");
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        if (firstElem >= totalResults)
        {
            firstElem = totalResults - numElem;
        }
        finalQuery.setFirstResult(firstElem);
        finalQuery.setMaxResults(numElem);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(numElem);
        ipList.setCurrentElement(firstElem);

        return ipList;
    }

    /**
     * Find next IpPoolManagement created and available/purchased by a public vLAN with filter
     * options
     *
     * @param vlanId identifier of the vlan.
     * @param excludedIps ips excluded from result if exists
     * @return next available IP address.
     */
    public IpPoolManagement findNextPublicIpAvailable(final Integer vdcId, final Integer vlanId,
        final String... excludedIps)
    {
        // Get the query that counts the total results.
        Query query =
            getSession().createQuery(
                BY_PUBLIC_VLAN_AND_PURCHASED
                    + defineOrderBy(IpPoolManagement.OrderByEnum.IP, Boolean.TRUE));
               
       
        query.setMaxResults(1);
        query.setParameter("vlan_id", vlanId);
        query.setParameter("vdc_id", vdcId);
        query.setParameter("filterLike", "%");
        if (excludedIps != null && excludedIps.length != 0)
        {
            query.setParameterList("excludedIp", Arrays.asList(excludedIps));
        }
        else
        {
            query.setString("excludedIp", null);
        }
        List<IpPoolManagement> result = query.list();

        return result.isEmpty() ? null : result.get(0);
    }

    /**
     * Find all the IpPoolManagement created by a vLAN with filter options
     *
     * @param vdcId identifier of the virtual datacenter.
     * @param vlanId identifier of the vlan.
     * @param firstElem first element to retrieve.
     * @param numElem number of elements to retrieve.
     * @param has filter %like%
     * @param orderby ordering filter. {@see IpPoolManagement.OrderByEnum}
     * @param asc ordering filter, ascending = true, descending = false.
     * @return List of IP addresses that pass the filter.
     */
    public List<IpPoolManagement> findIpsByPrivateVLANFiltered(final Integer vdcId,
        final Integer vlanId, Integer firstElem, Integer numElem, final String has,
        final IpPoolManagement.OrderByEnum orderby, final Boolean asc, final Boolean freeIps)
    {
        // Get the query that counts the total results.
        Query finalQuery;
        if (!freeIps)
        {
            finalQuery = getSession().createQuery(BY_VLAN + " " + defineOrderBy(orderby, asc));
        }
        else
        {
            finalQuery =
                getSession().createQuery(
                    BY_VLAN_WITHOUT_USED_IPS + " " + defineFilterAvailable()
                        + defineOrderBy(orderby, asc));
        }

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("vdc_id", vdcId);
        params.put("vlan_id", vlanId);
        params.put("filterLike", has.isEmpty() ? "%" : "%" + has + "%");
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        // Limit 0 means no size filter
        if (numElem == 0)
        {
            numElem = totalResults;
            firstElem = 0;
        }
        else if (firstElem >= totalResults)
        {
            firstElem = totalResults - numElem;
        }

        finalQuery.setFirstResult(firstElem);
        finalQuery.setMaxResults(numElem);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(numElem);
        ipList.setCurrentElement(firstElem);

        return ipList;
    }

    public List<IpPoolManagement> findIpsByVdc(final Integer vdcId, Integer firstElem,
        final Integer numElem, final String has, final IpPoolManagement.OrderByEnum orderby,
        final Boolean asc)
    {
        // Get the query that counts the total results.
        Query finalQuery = getSession().createQuery(BY_VDC + " " + defineOrderBy(orderby, asc));

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("vdc_id", vdcId);
        params.put("filterLike", has.isEmpty() ? "%" : "%" + has + "%");
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        if (firstElem == null)
        {
            firstElem = 0;
        }

        if (firstElem >= totalResults)
        {
            firstElem = totalResults - numElem;
        }
        finalQuery.setFirstResult(firstElem);
        finalQuery.setMaxResults(numElem);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(numElem);
        ipList.setCurrentElement(firstElem);

        return ipList;
    }

    public List<IpPoolManagement> findIpsByVirtualAppliance(final VirtualAppliance vapp)
    {
        Criterion onVapp = Restrictions.eq(RasdManagement.VIRTUAL_APPLIANCE_PROPERTY, vapp);
        Criteria criteria = getSession().createCriteria(IpPoolManagement.class).add(onVapp);
        List<IpPoolManagement> result = getResultList(criteria);

        return result;
    }

    public List<IpPoolManagement> findIpsByVirtualMachine(final VirtualMachine virtualMachine)
    {
        Query query = getSession().createQuery(BY_VIRTUAL_MACHINE);
        query.setParameter("vm_id", virtualMachine.getId());

        List<IpPoolManagement> ips = query.list();
        return ips;

    }

    public List<IpPoolManagement> findIpsByVirtualMachineWithConfigurationId(final VirtualMachine vm)
    {
        List<IpPoolManagement> ips = findIpsByVirtualMachine(vm);
        List<IpPoolManagement> resultIps = new ArrayList<IpPoolManagement>();
        for (IpPoolManagement ip : ips)
        {
            if (ip.getVlanNetwork().getConfiguration().getId()
                .equals(vm.getNetworkConfiguration().getId()))
            {
                resultIps.add(ip);
            }
        }
        return resultIps;
    }

    public List<IpPoolManagement> findIpsByVlan(final VLANNetwork vlan)
    {
        return findByCriterions(Restrictions.eq(IpPoolManagement.VLAN_NETWORK_PROPERTY, vlan));
    }

    /**
     * Find next IpPoolManagement created and available by a vLAN with filter options
     *
     * @param vlanId identifier of the vlan.
     * @param excludedIps ips excluded from result if exists
     * @return next available IP address.
     */
    public IpPoolManagement findNextExternalIpAvailable(final Integer vlanId,
        final String... excludedIps)
    {
        // Get the query that counts the total results.
        Query query =
            getSession().createQuery(
                BY_VLAN_NEXT_EXTERNAL_IP_AVAILABLE
                    + defineOrderBy(IpPoolManagement.OrderByEnum.IP, Boolean.TRUE));
        query.setMaxResults(1);
        query.setParameter("vlan_id", vlanId);
        // query.setLockMode("next_ip", LockMode.PESSIMISTIC_WRITE);
        if (excludedIps != null && excludedIps.length != 0)
        {
            query.setParameterList("excludedIp", Arrays.asList(excludedIps));
        }
        else
        {
            query.setString("excludedIp", null);
        }
        List<IpPoolManagement> result = query.list();

        return result.isEmpty() ? null : result.get(0);
    }

    /**
     * Find next IpPoolManagement created and available by a vLAN with filter options
     *
     * @param vlanId identifier of the vlan.
     * @param excludedIps ips excluded from result if exists
     * @return next available IP address.
     */
    public IpPoolManagement findNextIpAvailable(final Integer vlanId, final String... excludedIps)
    {
        // Get the query that counts the total results.
        Query query =
            getSession().createQuery(
                BY_VLAN_NEXT_AVAILABLE
                    + defineOrderBy(IpPoolManagement.OrderByEnum.IP, Boolean.TRUE));
        query.setMaxResults(1);
        query.setParameter("vlan_id", vlanId);
        // query.setLockMode("next_ip", LockMode.PESSIMISTIC_WRITE);
        if (excludedIps != null && excludedIps.length != 0)
        {
            query.setParameterList("excludedIp", Arrays.asList(excludedIps));
        }
        else
        {
            query.setString("excludedIp", null);
        }
        List<IpPoolManagement> result = query.list();

        return result.isEmpty() ? null : result.get(0);
    }

    public IpPoolManagement findPublicIpPurchasedByVirtualDatacenter(final Integer vdcId,
        final Integer ipId)
    {
        Query finalQuery = getSession().createQuery(BY_IP_PURCHASED);
        finalQuery.setParameter("vdc_id", vdcId);
        finalQuery.setParameter("ip_id", ipId);

        return (IpPoolManagement) finalQuery.uniqueResult();
    }

    /**
     * Return all the public IPS defined into a Datacenter.
     *
     * @param datacenterId identifier of the datacenter.
     * @param startwith first element to retrieve.
     * @param limit number of elements to retrieve.
     * @param filter filter query.
     * @param orderByEnum the way we order the query.
     * @param descOrAsc if the order is ascendant or descendant.
     * @return the list of matching {@link IpPoolManagement} object.
     */
    public List<IpPoolManagement> findPublicIpsByDatacenter(final Integer datacenterId,
        Integer startwith, final Integer limit, final String filter, final OrderByEnum orderByEnum,
        final Boolean descOrAsc, NetworkType type, final Boolean all)
    {
        NetworkType type2 = type;
        String query = BY_DATACENTER;
        if (type != null)
        {

            if (type.equals(NetworkType.EXTERNAL_UNMANAGED))
            {
                type = NetworkType.EXTERNAL;
                // to check. unecessary because with unmanaged vlan doesn't exist ips
                type2 = NetworkType.UNMANAGED;
            }
            // Get the query that counts the total results.
            query = BY_DATACENTER + " AND (vlan.type = :type OR vlan.type  = :type2 )";
        }

        Query finalQuery =
            getSession().createQuery(
                query + " " + defineAllFilter(all) + " " + defineOrderBy(orderByEnum, descOrAsc));

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("datacenter_id", datacenterId);
        params.put("filterLike", filter == null || filter.isEmpty() ? "%" : "%" + filter + "%");
        if (type != null)
        {
            params.put("type", type);
            params.put("type2", type2);
        }
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        if (limit != null)
        {
            finalQuery.setMaxResults(limit);
        }

        if (startwith >= totalResults)
        {
            startwith = totalResults - limit;
        }
        finalQuery.setFirstResult(startwith);
        finalQuery.setMaxResults(limit);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(limit);
        ipList.setCurrentElement(startwith);

        return ipList;
    }

    public List<IpPoolManagement> findPublicIpsByEnterpriseAndDatacenter(
        final Integer datacenterId, final Integer enterpriseId, Integer startwith,
        final Integer limit, final String filter, final OrderByEnum orderByEnum,
        final Boolean descOrAsc, NetworkType type, final Boolean all)
    {
        NetworkType type2 = type;
        String query = BY_DATACENTER;
        if (type != null)
        {

            if (type.equals(NetworkType.EXTERNAL_UNMANAGED))
            {
                type = NetworkType.EXTERNAL;
                // to check. unecessary because with unmanaged vlan doesn't exist ips
                type2 = NetworkType.UNMANAGED;
            }
            else if (type.equals(NetworkType.EXTERNAL))
            {
                type = NetworkType.EXTERNAL;
                type2 = NetworkType.EXTERNAL;
            }
            else if (type.equals(NetworkType.UNMANAGED))
            {
                type = NetworkType.UNMANAGED;
                type2 = NetworkType.UNMANAGED;
            }

            // Get the query that counts the total results.
            query =
                BY_DATACENTER
                    + " AND ent.id = :enterpriseId AND (vlan.type = :type OR vlan.type  = :type2 )  ";

        }

        Query finalQuery =
            getSession().createQuery(
                query + " " + defineAllFilter(all) + " " + defineOrderBy(orderByEnum, descOrAsc));

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("datacenter_id", datacenterId);
        params.put("filterLike", filter == null || filter.isEmpty() ? "%" : "%" + filter + "%");
        if (type != null)
        {
            params.put("type", type);
            params.put("type2", type2);
            params.put("enterpriseId", enterpriseId);
        }
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        if (limit != null)
        {
            finalQuery.setMaxResults(limit);
        }

        if (startwith >= totalResults)
        {
            startwith = totalResults - limit;
        }
        finalQuery.setFirstResult(startwith);
        finalQuery.setMaxResults(limit);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(limit);
        ipList.setCurrentElement(startwith);

        return ipList;
    }

    public List<IpPoolManagement> findPublicIpsByVlan(final Integer datacenterId,
        final Integer vlanId, Integer startwith, Integer limit, final String filter,
        final OrderByEnum orderByEnum, final Boolean descOrAsc, final Boolean all)
    {
        Query finalQuery =
            getSession().createQuery(
                BY_PUBLIC_VLAN + " " + defineAllFilter(all) + " "
                    + defineOrderBy(orderByEnum, descOrAsc));

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("datacenter_id", datacenterId);
        params.put("vlan_id", vlanId);
        params.put("filterLike", filter == null || filter.isEmpty() ? "%" : "%" + filter + "%");
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        // Limit 0 means no size filter
        if (limit == 0)
        {
            limit = totalResults;
            startwith = 0;
        }
        else if (startwith >= totalResults)
        {
            startwith = totalResults - limit;
        }

        finalQuery.setFirstResult(startwith);
        finalQuery.setMaxResults(limit);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(limit);
        ipList.setCurrentElement(startwith);

        return ipList;
    }

    public List<IpPoolManagement> findPublicIpsPurchasedByVirtualDatacenter(final Integer vdcId,
        final Boolean onlyAvailabe, Integer startwith, final Integer limit, final String filter,
        final OrderByEnum orderByEnum, final Boolean descOrAsc, final Integer vlanId)
    {
        Query finalQuery =
            getSession().createQuery(
                BY_VDC_PURCHASED + " " + defineOnlyAvailableFilter(onlyAvailabe)
                    + defineVlanIdFilter(vlanId) + defineOrderBy(orderByEnum, descOrAsc));

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("vdc_id", vdcId);
        params.put("filterLike", filter == null || filter.isEmpty() ? "%" : "%" + filter + "%");
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        if (limit != null)
        {
            finalQuery.setMaxResults(limit);
        }

        if (startwith >= totalResults)
        {
            startwith = totalResults - limit;
        }
        finalQuery.setFirstResult(startwith);
        finalQuery.setMaxResults(limit);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(limit);
        ipList.setCurrentElement(startwith);

        return ipList;

    }

    /**
     * Return the list of IPs purchased by an enterprise in a public VLAN. Any IP in a public VLAN
     * with VirtualDatacenter not null
     *
     * @param vlan network to search into.
     * @return the list of with IPs purchased.
     */
    public List<IpPoolManagement> findPublicIpsPurchasedByVlan(final VLANNetwork vlan)
    {
        return findByCriterions(Restrictions.eq(IpPoolManagement.VLAN_NETWORK_PROPERTY, vlan),
            Restrictions.isNotNull(RasdManagement.VIRTUAL_DATACENTER_PROPERTY));
    }

    public List<IpPoolManagement> findPublicIpsToPurchaseByVirtualDatacenter(final Integer vdcId,
        Integer startwith, final Integer limit, final String filter, final OrderByEnum orderByEnum,
        final Boolean descOrAsc, final Integer vlanId)
    {
        Query finalQuery =
            getSession().createQuery(
                BY_VDC_TO_PURCHASE + " " + defineVlanIdFilter(vlanId)
                    + defineOrderBy(orderByEnum, descOrAsc));

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("vdc_id", vdcId);
        params.put("filterLike", filter == null || filter.isEmpty() ? "%" : "%" + filter + "%");
        finalQuery.setProperties(params);

        // Check if the page requested is bigger than the last one
        Integer totalResults = count(finalQuery, params).intValue();

        if (limit != null)
        {
            finalQuery.setMaxResults(limit);
        }

        if (startwith >= totalResults)
        {
            startwith = totalResults - limit;
        }
        finalQuery.setFirstResult(startwith);
        finalQuery.setMaxResults(limit);

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);
        ipList.setPageSize(limit);
        ipList.setCurrentElement(startwith);

        return ipList;
    }

    public IpPoolManagement findPublicIpToPurchaseByVirtualDatacenter(final Integer vdcId,
        final Integer ipId)
    {
        Query finalQuery = getSession().createQuery(BY_IP_TO_PURCHASE);
        finalQuery.setParameter("vdc_id", vdcId);
        finalQuery.setParameter("ip_id", ipId);

        return (IpPoolManagement) finalQuery.uniqueResult();
    }

    public List<IpPoolManagement> findUsedIpsByPrivateVLAN(final Integer vlanId)
    {
        Query finalQuery =
            getSession().createQuery(BY_VLAN_USED_BY_ANY_VM + " " + defineFilterUsed());

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("vlan_id", vlanId);
        params.put("filterLike", "%");
        finalQuery.setProperties(params);

        Integer totalResults = count(finalQuery, params).intValue();

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);

        return ipList;
    }

    /**
     * Return the {@link PagedList} entity with the used Ips by VLAN.
     *
     * @param vdcId virtual datacenter id
     * @param vlanId vlan id
     * @return list of used IpPoolManagement.
     */
    public List<IpPoolManagement> findUsedIpsByPrivateVLAN(final Integer vdcId, final Integer vlanId)
    {
        Query finalQuery = getSession().createQuery(BY_VLAN + " " + defineFilterUsed());

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("vdc_id", vdcId);
        params.put("vlan_id", vlanId);
        params.put("filterLike", "%");
        finalQuery.setProperties(params);

        Integer totalResults = count(finalQuery, params).intValue();

        PagedList<IpPoolManagement> ipList = new PagedList<IpPoolManagement>(finalQuery.list());
        ipList.setTotalResults(totalResults);

        return ipList;
    }

    public Collection<String> getAllMacs()
    {
        Criteria criteria = getSession().createCriteria(IpPoolManagement.class);
        ProjectionList projList = Projections.projectionList();
        projList.add(Projections.property(IpPoolManagement.MAC_PROPERTY));

        criteria.setProjection(projList);
        return criteria.list();
    }

    public List<IpPoolManagement> getPublicNetworkPoolPurchasedByEnterprise(
        final Integer enterpriseId)
    {
        Query query = getSession().createQuery(GET_NETWORK_POOL_PURCHASED_BY_ENTERPRISE);
        query.setParameter("enterpriseId", enterpriseId);

        return query.list();
    }

    public boolean isDefaultNetworkofanyVDC(final Integer vlanId)
    {
        Query query = getSession().createSQLQuery(BY_DEFAULT_VLAN_USED_BY_ANY_VDC);
        query.setParameter("vlan_id", vlanId);
        return !query.list().isEmpty();
    }

    /**
     * Return if there is any virtual machine that is using the VLAN.
     *
     * @param virtualMachineId identifier of the {@link VirtualMachine}
     * @param vlanNetwork {@link VLANNetwork} to check.
     * @return true or false. It is a boolean, dude!
     */
    public Boolean isVlanAssignedToDifferentVM(final Integer virtualMachineId,
        final VLANNetwork vlanNetwork)
    {
        List<IpPoolManagement> ippoolList;
        // Query query =
        // getSession().createSQLQuery(
        // GET_IPPOOLMANAGEMENT_ASSIGNED_TO_DIFFERENT_VM_AND_DIFFERENT_FROM_NOT_DEPLOYED_SQL);
        Query query = getSession().createQuery(GET_VLAN_ASSIGNED_TO_ANOTHER_VIRTUALMACHINE);
        query.setParameter("idVlan", vlanNetwork.getId());
        query.setParameter("idVm", virtualMachineId);
        ippoolList = query.list();

        if (ippoolList == null || ippoolList.isEmpty())
        {
            return false;
        }
        return true;
    }

    public boolean privateVLANinUseByAnyVDC(final Integer vlanId)
    {
        List<IpPoolManagement> ippoolList;
        Query query = getSession().createSQLQuery(BY_VLAN_USED_BY_ANY_VDC);
        query.setParameter("vlan_id", vlanId);
        ippoolList = query.list();

        if (ippoolList.isEmpty())
        {
            return false;
        }
        return true;
    }

    /**
     * If the 'all' is set, return all the IPs by a public vlan.
     *
     * @param all boolean to set if we should return all the IPs.
     * @return a String filter.
     */
    private String defineAllFilter(final Boolean all)
    {
        if (!all)
        {
            return " AND ip.available = 1";
        }

        return "";
    }

    /**
     * Adds the filter for only available ip addresses in the private network.
     *
     * @return the query string that defines the filter.
     */
    private String defineFilterAvailable()
    {
        return " AND vm is null";
    }

    /**
     * Adds the filter to return only the VLANs used.
     *
     * @return the string with the filter.
     */
    private String defineFilterDeployed()
    {
        return " AND vm is not null AND vm.state != 'NOT_ALLOCATED'";
    }

    /**
     * Adds the filter to return only the VLANs used.
     *
     * @return the string with the filter.
     */
    private String defineFilterUsed()
    {
        return " AND vm is not null";
    }

    private String defineOnlyAvailableFilter(final Boolean onlyAvailable)
    {
        if (onlyAvailable)
        {
            return " AND vm is null ";
        }
        else
        {
            return "";
        }
    }

    private String defineOnlyAvailableFilterExternal(final Boolean onlyAvailable)
    {
        if (onlyAvailable)
        {
            return " AND vm is null AND ip.quarantine = 0 ";
        }
        else
        {
            return "";
        }
    }

    private String defineOrderBy(final IpPoolManagement.OrderByEnum orderBy, final Boolean asc)
    {

        StringBuilder queryString = new StringBuilder();

        queryString.append(" order by ");
        switch (orderBy)
        {
            case IP:
            {
                if (asc)
                {
                    queryString
                        .append(" cast(substring(ip.ip, 1, locate('.', ip.ip) - 1) as integer) asc, cast(substring(ip.ip, locate('.', ip.ip) + 1, locate('.', ip.ip, locate('.', ip.ip) + 1) - locate('.', ip.ip) - 1) as integer) asc, cast(substring(ip.ip, locate('.', ip.ip, locate('.', ip.ip) + 1) + 1, locate('.', ip.ip, locate('.', ip.ip, locate('.', ip.ip) + 1) + 1) - locate('.', ip.ip, locate('.', ip.ip) +  1) - 1) as integer) asc, cast(substring(ip.ip, locate('.', ip.ip, locate('.', ip.ip, locate('.', ip.ip) + 1) + 1) + 1, 3) as integer) ");

                }
                else
                {
                    queryString
                        .append(" cast(substring(ip.ip, 1, locate('.', ip.ip) - 1) as integer) desc, cast(substring(ip.ip, locate('.', ip.ip) + 1, locate('.', ip.ip, locate('.', ip.ip) + 1) - locate('.', ip.ip) - 1) as integer) desc, cast(substring(ip.ip, locate('.', ip.ip, locate('.', ip.ip) + 1) + 1, locate('.', ip.ip, locate('.', ip.ip, locate('.', ip.ip) + 1) + 1) - locate('.', ip.ip, locate('.', ip.ip) +  1) - 1) as integer) desc, cast(substring(ip.ip, locate('.', ip.ip, locate('.', ip.ip, locate('.', ip.ip) + 1) + 1) + 1, 3) as integer) ");

                }
                break;

            }
            case QUARANTINE:
            {
                queryString.append("ip.quarantine ");
                break;
            }
            case MAC:
            {
                queryString.append("ip.mac ");
                break;
            }
            case VLAN:
            {
                queryString.append("ip.vlanNetwork.name ");
                break;
            }
            case VIRTUALDATACENTER:
            {
                queryString.append("vdc.name ");
                break;
            }
            case VIRTUALMACHINE:
            {
                queryString.append("vm.name ");
                break;
            }
            case VIRTUALAPPLIANCE:
            {
                queryString.append("vapp.name ");
                break;
            }

            case ENTERPRISENAME:
            {
                queryString.append("ent.name ");
                break;
            }
            case LEASE:
            {
                queryString.append("ip.name ");
            }
        }

        if (asc)
        {
            queryString.append("asc");
        }
        else
        {
            queryString.append("desc");
        }

        return queryString.toString();
    }

    private String defineVlanIdFilter(final Integer vlanId)
    {
        if (vlanId != null)
        {
            return " AND vlan.id = " + vlanId + " ";
        }

        return "";
    }

}
TOP

Related Classes of com.abiquo.server.core.infrastructure.network.IpPoolManagementDAO

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.