package org.openstack.atlas.service.domain.repository;
import org.openstack.atlas.service.domain.entities.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;
@Repository
@Transactional
public class AccountLimitRepository {
final Log LOG = LogFactory.getLog(AccountLimitRepository.class);
@PersistenceContext(unitName = "loadbalancing")
private EntityManager entityManager;
public AccountLimit getById(Integer id) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<AccountLimit> criteria = builder.createQuery(AccountLimit.class);
Root<AccountLimit> accountLimitRoot = criteria.from(AccountLimit.class);
Predicate hasId = builder.equal(accountLimitRoot.get(AccountLimit_.id), id);
criteria.select(accountLimitRoot);
criteria.where(hasId);
return entityManager.createQuery(criteria).getSingleResult();
}
public AccountLimit getByIdAndAccountId(Integer id, Integer accountId) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<AccountLimit> criteria = builder.createQuery(AccountLimit.class);
Root<AccountLimit> accountLimitRoot = criteria.from(AccountLimit.class);
Predicate hasId = builder.equal(accountLimitRoot.get(AccountLimit_.id), id);
Predicate hasAccountId = builder.equal(accountLimitRoot.get(AccountLimit_.accountId), accountId);
criteria.select(accountLimitRoot);
criteria.where(hasId);
criteria.where(hasAccountId);
return entityManager.createQuery(criteria).getSingleResult();
}
public AccountLimit getByAccountIdAndType(Integer accountId, LimitType type) throws NoResultException {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<AccountLimit> criteria = builder.createQuery(AccountLimit.class);
Root<AccountLimit> accountLimitRoot = criteria.from(AccountLimit.class);
Predicate hasAccountId = builder.equal(accountLimitRoot.get(AccountLimit_.accountId), accountId);
Predicate hasType = builder.equal(accountLimitRoot.get(AccountLimit_.limitType), type);
criteria.select(accountLimitRoot);
criteria.where(builder.and(hasType, hasAccountId));
return entityManager.createQuery(criteria).getSingleResult();
}
public void save(AccountLimit accountLimit) {
entityManager.persist(accountLimit);
}
public void save(LimitType limitType) {
entityManager.persist(limitType);
}
public void delete(AccountLimit accountLimit) {
accountLimit = entityManager.merge(accountLimit);
entityManager.remove(accountLimit);
}
public AccountLimit update(AccountLimit accountLimit) {
LOG.info("Updating AccountLimit " + accountLimit.getId() + "...");
accountLimit = entityManager.merge(accountLimit);
entityManager.flush();
return accountLimit;
}
public List<AccountLimit> getAccountLimits(Integer accountId) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<AccountLimit> criteria = builder.createQuery(AccountLimit.class);
Root<AccountLimit> accountLimitRoot = criteria.from(AccountLimit.class);
Predicate hasAccountId = builder.equal(accountLimitRoot.get(AccountLimit_.accountId), accountId);
criteria.select(accountLimitRoot);
criteria.where(hasAccountId);
return entityManager.createQuery(criteria).getResultList();
}
public LimitType getLimitType(AccountLimitType acountLimitType) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<LimitType> criteria = builder.createQuery(LimitType.class);
Root<LimitType> limitTypeRoot = criteria.from(LimitType.class);
Predicate hasName = builder.equal(limitTypeRoot.get(LimitType_.name), acountLimitType);
criteria.select(limitTypeRoot);
criteria.where(hasName);
return entityManager.createQuery(criteria).getSingleResult();
}
public List<LimitType> getAllLimitTypes() {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<LimitType> criteria = builder.createQuery(LimitType.class);
Root<LimitType> limitTypeRoot = criteria.from(LimitType.class);
criteria.select(limitTypeRoot);
return entityManager.createQuery(criteria).getResultList();
}
public List<AccountLimit> getAllCustomLimits(){
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<AccountLimit> criteria = builder.createQuery(AccountLimit.class);
Root<AccountLimit> accountLimitRoot = criteria.from(AccountLimit.class);
criteria.select(accountLimitRoot);
return entityManager.createQuery(criteria).getResultList();
}
}