/**
* 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.storage;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.hibernate.Criteria;
import org.hibernate.NonUniqueResultException;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import com.abiquo.server.core.common.persistence.DefaultDAOBase;
@Repository("jpaInitiatorMappingDAO")
public class InitiatorMappingDAO extends DefaultDAOBase<Integer, InitiatorMapping>
{
public InitiatorMappingDAO()
{
super(InitiatorMapping.class);
}
public InitiatorMappingDAO(final EntityManager entityManager)
{
super(InitiatorMapping.class, entityManager);
}
public InitiatorMapping findByVolumeAndInitiator(final Integer idVolumeManagement,
final String initiatorIqn)
{
Criteria criteria =
createCriteria(sameVolume(idVolumeManagement)).add(sameInitiator(initiatorIqn));
// Return null if none found, but do not fail
return (InitiatorMapping) criteria.uniqueResult();
}
@SuppressWarnings("unchecked")
public List<InitiatorMapping> findByVolumeId(final Integer idVolume)
{
Criteria criteria = createCriteria(sameVolume(idVolume));
return criteria.list();
}
public InitiatorMapping findBPMMappingForVolume(final Integer idVolume, final String bpmAddress)
{
// IMPORTANT! This method assumes that a volume can not be moved between physical
// Datacenters. Otherwise this must be refactored.
Query query = getEntityManager().createNamedQuery(InitiatorMapping.INITIATOR_MAPPING_BPM);
query.setParameter("idVolume", idVolume);
query.setParameter("bpmAddress", bpmAddress);
List< ? > results = query.getResultList();
if (results.size() > 1)
{
throw new NonUniqueResultException(results.size());
}
return results.isEmpty() ? null : (InitiatorMapping) results.get(0);
}
@SuppressWarnings("unchecked")
public List<InitiatorMapping> findByInitiatorIqn(final String initiatorIqn)
{
Criteria criteria = createCriteria(sameInitiator(initiatorIqn));
return criteria.list();
}
public void deleteMappingsForInitiator(final String initiatorIqn)
{
Query query =
getEntityManager().createQuery(
"DELETE FROM " + getPersistentClass().getSimpleName()
+ " WHERE initiatorIqn = :initiatorIqn");
query.setParameter("initiatorIqn", initiatorIqn);
query.executeUpdate();
}
private static Criterion sameVolume(final Integer idVolume)
{
return Restrictions.eq("volume.id", idVolume);
}
private static Criterion sameInitiator(final String initiator)
{
return Restrictions.eq("initiatorIqn", initiator);
}
}