package org.openstack.atlas.service.domain.repository; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bouncycastle.crypto.tls.Certificate; import org.openstack.atlas.service.domain.entities.*; import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException; import org.openstack.atlas.service.domain.util.Constants; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; 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.Calendar; import java.util.HashSet; import java.util.List; import java.util.Set; @org.springframework.stereotype.Repository @Transactional public class CertificateMappingRepository { final Log LOG = LogFactory.getLog(CertificateMappingRepository.class); @PersistenceContext(unitName = "loadbalancing") private EntityManager entityManager; public CertificateMapping getByIdAndLoadBalancerId(Integer id, Integer lbId) throws EntityNotFoundException { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<CertificateMapping> criteria = builder.createQuery(CertificateMapping.class); Root<CertificateMapping> certificateMappingRoot = criteria.from(CertificateMapping.class); LoadBalancer lb = new LoadBalancer(); lb.setId(lbId); Predicate hasId = builder.equal(certificateMappingRoot.get(CertificateMapping_.id), id); Predicate hasLoadBalancerId = builder.equal(certificateMappingRoot.get(CertificateMapping_.loadbalancer), lb); criteria.select(certificateMappingRoot); criteria.where(builder.and(hasId, hasLoadBalancerId)); List<CertificateMapping> resultList = entityManager.createQuery(criteria).getResultList(); if (resultList.isEmpty()) { throw new EntityNotFoundException(Constants.CertificateMappingNotFound); } else { return resultList.get(0); } } public List<CertificateMapping> getAllForLoadBalancerId(Integer lbId) { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<CertificateMapping> criteria = builder.createQuery(CertificateMapping.class); Root<CertificateMapping> certificateMappingRoot = criteria.from(CertificateMapping.class); LoadBalancer lb = new LoadBalancer(); lb.setId(lbId); Predicate hasLoadBalancerId = builder.equal(certificateMappingRoot.get(CertificateMapping_.loadbalancer), lb); criteria.select(certificateMappingRoot); criteria.where(hasLoadBalancerId); return entityManager.createQuery(criteria).getResultList(); } public CertificateMapping save(CertificateMapping certificateMapping, int lbId) { LoadBalancer lb = new LoadBalancer(); lb.setId(lbId); certificateMapping.setLoadbalancer(lb); return entityManager.merge(certificateMapping); } public LoadBalancer update(LoadBalancer loadBalancer) { final Set<LoadBalancerJoinVip> lbJoinVipsToLink = loadBalancer.getLoadBalancerJoinVipSet(); loadBalancer.setLoadBalancerJoinVipSet(null); loadBalancer.setUpdated(Calendar.getInstance()); loadBalancer = entityManager.merge(loadBalancer); // Now attach loadbalancer to vips for (LoadBalancerJoinVip lbJoinVipToLink : lbJoinVipsToLink) { VirtualIp virtualIp = entityManager.find(VirtualIp.class, lbJoinVipToLink.getVirtualIp().getId()); LoadBalancerJoinVip loadBalancerJoinVip = new LoadBalancerJoinVip(loadBalancer.getPort(), loadBalancer, virtualIp); entityManager.merge(loadBalancerJoinVip); entityManager.merge(lbJoinVipToLink.getVirtualIp()); } entityManager.flush(); return loadBalancer; } public void delete(LoadBalancer loadBalancer, Integer id) throws EntityNotFoundException { Set<CertificateMapping> dbCertificateMappings = new HashSet<CertificateMapping>(loadBalancer.getCertificateMappings()); Boolean removed = false; for (CertificateMapping certificateMapping : dbCertificateMappings) { Integer certificateMappingId = certificateMapping.getId(); if (certificateMappingId.equals(id)) { loadBalancer.getCertificateMappings().remove(certificateMapping); removed = true; } } if (!removed) { String message = Constants.CertificateMappingNotFound; LOG.warn(message); throw new EntityNotFoundException(message); } loadBalancer.setUpdated(Calendar.getInstance()); entityManager.merge(loadBalancer); entityManager.flush(); } }