package org.openstack.atlas.service.domain.repository;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openstack.atlas.service.domain.entities.Node;
import org.openstack.atlas.service.domain.entities.NodeMeta;
import org.openstack.atlas.service.domain.entities.NodeMeta_;
import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException;
import org.openstack.atlas.service.domain.util.Constants;
import org.springframework.stereotype.Repository;
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.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
@Repository
@Transactional
public class NodeMetadataRepository {
final Log LOG = LogFactory.getLog(NodeMetadataRepository.class);
@PersistenceContext(unitName = "loadbalancing")
private EntityManager entityManager;
public List<NodeMeta> addNodeMetas(Node node, Collection<NodeMeta> metas) {
List<NodeMeta> newMetas = new ArrayList<NodeMeta>();
for (NodeMeta meta : metas) {
meta.setNode(node);
newMetas.add(entityManager.merge(meta));
}
node.getNodeMetadata().addAll(newMetas);
node.getLoadbalancer().setUpdated(Calendar.getInstance());
entityManager.merge(node.getLoadbalancer());
entityManager.flush();
return newMetas;
}
public List<NodeMeta> getNodeMetaDataByAccountIdNodeId(Integer nodeId) {
List<NodeMeta> list = new ArrayList<NodeMeta>();
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<NodeMeta> criteria = builder.createQuery(NodeMeta.class);
Root<NodeMeta> nodeMetaRoot = criteria.from(NodeMeta.class);
Node node = new Node();
node.setId(nodeId);
Predicate belongsToNode = builder.equal(nodeMetaRoot.get(NodeMeta_.node), node);
criteria.select(nodeMetaRoot);
criteria.where(belongsToNode);
list = entityManager.createQuery(criteria).getResultList();
return list;
}
public void deleteMetadata(Node node, Collection<Integer> ids) throws EntityNotFoundException {
List<NodeMeta> nodeMetas = new ArrayList<NodeMeta>();
Boolean exists = false;
for (NodeMeta meta : node.getNodeMetadata()) {
if (ids.contains(meta.getId()))
exists = true;
else {
nodeMetas.add(meta);
}
}
if (!exists) {
String message = Constants.MetaNotFound;
LOG.warn(message);
throw new EntityNotFoundException(message);
}
entityManager.createQuery("DELETE FROM NodeMeta n WHERE n.id IN (:ids)").setParameter("ids", ids).executeUpdate();
node.setNodeMetadata(nodeMetas);
node.getLoadbalancer().setUpdated(Calendar.getInstance());
entityManager.merge(node.getLoadbalancer());
entityManager.flush();
}
public NodeMeta getNodeMeta(Integer nodeId, Integer id) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<NodeMeta> criteria = builder.createQuery(NodeMeta.class);
Root<NodeMeta> nodeMetaRoot = criteria.from(NodeMeta.class);
Node node = new Node();
node.setId(nodeId);
Predicate belongsToNode = builder.equal(nodeMetaRoot.get(NodeMeta_.node), node);
Predicate hasId = builder.equal(nodeMetaRoot.get(NodeMeta_.id), id);
criteria.select(nodeMetaRoot);
criteria.where(builder.and(belongsToNode, hasId));
NodeMeta resultItem;
try {
resultItem = entityManager.createQuery(criteria).getSingleResult();
} catch (Exception e) {
return new NodeMeta();
}
return resultItem;
}
public NodeMeta updateNodeMeta(Node node, NodeMeta callNodeMeta) {
for (NodeMeta nodeMeta : node.getNodeMetadata()) {
if (nodeMeta.getId().equals(callNodeMeta.getId())) {
nodeMeta.setKey(callNodeMeta.getKey());
nodeMeta.setValue(callNodeMeta.getValue());
nodeMeta.setNode(node);
}
}
node.getLoadbalancer().setUpdated(Calendar.getInstance());
entityManager.merge(node.getLoadbalancer());
entityManager.flush();
return callNodeMeta;
}
}