/**
* Abiquo community edition
* cloud management application for hybrid clouds
* Copyright (C) 2008-2010 - Abiquo Holdings S.L.
*
* This application is free software; you can redistribute it and/or
* modify it under the terms of the GNU LESSER GENERAL PUBLIC
* LICENSE as published by the Free Software Foundation under
* version 3 of the License
*
* This software 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
* LESSER GENERAL PUBLIC LICENSE v.3 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/**
*
*/
package com.abiquo.abiserver.persistence.dao.metering.hibernate;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import com.abiquo.abiserver.business.hibernate.pojohb.metering.MeterHB;
import com.abiquo.abiserver.business.hibernate.pojohb.user.UserHB;
import com.abiquo.abiserver.exception.PersistenceException;
import com.abiquo.abiserver.persistence.dao.metering.MeterDAO;
import com.abiquo.abiserver.persistence.hibernate.HibernateDAO;
import com.abiquo.abiserver.persistence.hibernate.HibernateDAOFactory;
import com.abiquo.abiserver.security.SecurityService;
/**
* * Class that implements the extra DAO functions for the
* {@link com.abiquo.abiserver.persistence.dao.metering.MeterDAO} interface
*
* @author jdevesa@abiquo.com
*/
public class MeterDAOHibernate extends HibernateDAO<MeterHB, Long> implements MeterDAO
{
private static final String GET_METER_LIST_FILTERED = "GET_METER_LIST_FILTERED";
@SuppressWarnings("unchecked")
@Override
public List<MeterHB> findAllByFilter(final HashMap<String, String> filter,
final List<String> performedbyList, final Integer numrows, final UserHB user)
throws PersistenceException
{
Integer numberOfParameters = 0;
List<MeterHB> listOfMeters = new ArrayList<MeterHB>();
StringBuilder stringQuery =
new StringBuilder("from com.abiquo.abiserver.business.hibernate.pojohb.metering.MeterHB ");
// Create Dates
String fromDateInit = new Timestamp(0).toString();
String fromdateFilter;
if (filter.containsKey("datefrom"))
{
fromdateFilter = new Timestamp(Long.valueOf(filter.get("datefrom")) * 1000).toString();
}
else
{
fromdateFilter = fromDateInit;
}
String toDateEnd = new Timestamp(new Date().getTime()).toString();
String todateFilter;
if (filter.containsKey("dateto"))
{
// We sum another day to include both filters
todateFilter =
new Timestamp((Long.valueOf(filter.get("dateto")) + 86400) * 1000).toString();
}
else
{
todateFilter = toDateEnd;
}
stringQuery.append("where timestamp between '").append(fromdateFilter).append("' and '")
.append(todateFilter).append("' and timestamp > '")
.append(user.getCreationDate().toString()).append("'");
// create all the filters from the HashMap information. Due all of them are included in the
// query, we need to
// insert '%' for all the filters not included in the hashmap
if (filter.containsKey("datacenter"))
{
stringQuery.append(" and datacenter like '%" + filter.get("datacenter") + "%'");
}
if (filter.containsKey("rack"))
{
stringQuery.append(" and rack like '%" + filter.get("rack") + "%'");
}
if (filter.containsKey("physicalmachine"))
{
stringQuery.append(" and physicalMachine like '%" + filter.get("physicalmachine")
+ "%'");
}
if (filter.containsKey("storagesystem"))
{
stringQuery.append(" and storagesystem like '%" + filter.get("storagesystem") + "%'");
}
if (filter.containsKey("storagepool"))
{
stringQuery.append(" and storagepool like '%" + filter.get("storagepool") + "%'");
}
if (filter.containsKey("volume"))
{
stringQuery.append(" and volume like '%" + filter.get("volume") + "%'");
}
if (filter.containsKey("network"))
{
stringQuery.append(" and network like '%" + filter.get("network") + "%'");
}
if (filter.containsKey("subnet"))
{
stringQuery.append(" and subnet like '%" + filter.get("subnet") + "%'");
}
if (filter.containsKey("enterprise"))
{
stringQuery.append(" and enterprise like '%"
+ replaceApostrophe(filter.get("enterprise")) + "%'");
}
if (filter.containsKey("user"))
{
stringQuery.append(" and user like '%" + filter.get("user") + "%'");
}
if (filter.containsKey("virtualdatacenter"))
{
stringQuery.append(" and virtualDataCenter like '%" + filter.get("virtualdatacenter")
+ "%'");
}
if (filter.containsKey("virtualapp"))
{
stringQuery.append(" and virtualApp like '%" + filter.get("virtualapp") + "%'");
}
if (filter.containsKey("virtualmachine"))
{
stringQuery.append(" and virtualmachine like '%" + filter.get("virtualmachine") + "%'");
}
if (filter.containsKey("severity"))
{
stringQuery.append(" and severity like '" + filter.get("severity") + "%'");
}
if (filter.containsKey("performedby"))
{
stringQuery.append(" and performedby like '%" + filter.get("performedby") + "%'");
}
if (filter.containsKey("actionperformed"))
{
stringQuery
.append(" and actionperformed like '" + filter.get("actionperformed") + "%'");
}
if (filter.containsKey("component"))
{
stringQuery.append(" and component like '%" + filter.get("component") + "%'");
}
// if (role != Role.SYS_ADMIN)
if (!SecurityService.isCloudAdmin(user.getRoleHB().toPojo()))
{
if (!SecurityService.hasPrivilege(SecurityService.EVENTLOG_VIEW_ENTERPRISE, user
.getRoleHB().toPojo())
&& !SecurityService.hasPrivilege(SecurityService.EVENTLOG_VIEW_ALL, user
.getRoleHB().toPojo()))
{
stringQuery.append(" and idUser = " + user.getIdUser());
}
if (performedbyList != null && !performedbyList.isEmpty())
{
// performedby filter
stringQuery.append(" and performedby in (");
boolean firstentry = true;
for (String currentString : performedbyList)
{
if (firstentry == false)
{
stringQuery.append(",");
}
stringQuery.append("'" + currentString + "'");
if (firstentry == true)
{
firstentry = false;
}
}
stringQuery.append(")");
}
}
// delete last ','
stringQuery.append(" order by timestamp desc");
// Setting the query
Session session = HibernateDAOFactory.getSessionFactory().getCurrentSession();
Query meterQuery = session.createQuery(stringQuery.toString());
meterQuery.setMaxResults(numrows);
listOfMeters = meterQuery.list();
return listOfMeters;
}
private final String replaceApostrophe(final String name)
{
return name.replaceAll("'", "''");
}
}