/**
* 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.server.core.common.persistence;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import com.abiquo.server.core.common.GenericEnityBase;
import com.softwarementors.bzngine.dao.hibernate.JpaHibernateDaoBase;
import com.softwarementors.bzngine.entities.PersistentEntity;
public abstract class DefaultDAOBase<I extends Serializable, T extends GenericEnityBase<I>> extends
JpaHibernateDaoBase<T, I>
{
private boolean managed;
@PersistenceContext
@Override
protected void setEntityManager(final EntityManager entityManager)
{
super.setEntityManager(entityManager);
}
/* default constructor for Spring */
protected DefaultDAOBase(final Class<T> persistentClass)
{
super(persistentClass);
this.managed = true;
}
/*
* @SuppressWarnings("deprecation") public Connection getConnection() { return
* getSession().connection(); }
*/
protected DefaultDAOBase(final Class<T> persistentClass, final EntityManager entityManager)
{
super(persistentClass, entityManager);
}
// TODO: PAG, fix this by changing parameter type for base class isManaged
public boolean isManaged2(final PersistentEntity< ? > entity)
{
assert entity != null;
assert isOpen();
assert isInTransaction();
return entity.getId() != null && getEntityManager().contains(entity);
}
@Override
public boolean isInTransaction()
{
if (!managed)
{
return super.isInTransaction();
}
return TransactionSynchronizationManager.isActualTransactionActive();
}
@Override
public boolean isInReadWriteTransaction()
{
if (!managed)
{
return super.isInReadWriteTransaction();
}
return !TransactionSynchronizationManager.isCurrentTransactionReadOnly();
}
@Override
public boolean isInRollbackTransaction()
{
if (!managed)
{
return super.isInRollbackTransaction();
}
return !TransactionSynchronizationManager.isSynchronizationActive();
}
public T findUniqueByProperty(final String propertyName, final String value)
{
Criterion criterion = Restrictions.eq(propertyName, value);
return findUniqueByCriterions(criterion);
}
protected Criteria createNestedCriteria(final String... propertyNames)
{
Criteria crit = getSession().createCriteria(getPersistentClass());
return createNestedCriteria(crit, propertyNames);
}
protected Criteria createNestedCriteria(final Order order, final String... propertyNames)
{
Criteria crit = getSession().createCriteria(getPersistentClass());
crit.addOrder(order);
return createNestedCriteria(crit, propertyNames);
}
private Criteria createNestedCriteria(final Criteria baseCriteria,
final String... propertyNames)
{
Criteria crit = baseCriteria;
for (String property : propertyNames)
{
crit = crit.createCriteria(property);
}
return crit;
}
protected Long count()
{
Criteria criteria = getSession().createCriteria(getPersistentClass());
return count(criteria);
}
protected Long count(final Criteria criteria)
{
criteria.setProjection(Projections.rowCount());
return (Long) criteria.uniqueResult();
}
protected T getSingleResultOrNull(final Criteria criteria)
{
List<T> results = getResultList(criteria);
return (results == null || results.isEmpty()) ? null : results.get(0);
}
public void detach(final T entity)
{
this.getEntityManager().detach(entity);
}
}