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.BlacklistItem;
import org.openstack.atlas.service.domain.entities.IpVersion;
import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException;
import org.openstack.atlas.util.ip.IPv6Cidr;
import org.openstack.atlas.util.ip.exception.IPStringConversionException;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Repository
@Transactional
public class BlacklistRepository {
final Log LOG = LogFactory.getLog(BlacklistRepository.class);
@PersistenceContext(unitName = "loadbalancing")
private EntityManager entityManager;
public BlacklistItem getById(Integer id) throws EntityNotFoundException {
BlacklistItem bl = entityManager.find(BlacklistItem.class, id);
if (bl == null) {
String errMsg = String.format("Cannot access blacklistitem {id=%d}", id);
LOG.warn(errMsg);
throw new EntityNotFoundException(errMsg);
}
return bl;
}
public void delete(BlacklistItem blacklistItem) {
blacklistItem = entityManager.merge(blacklistItem);
entityManager.remove(blacklistItem);
}
public List<BlacklistItem> getAllBlacklistItems() {
Query query = entityManager.createQuery("SELECT b FROM BlacklistItem b");
return query.getResultList();
}
public void saveBlacklist(List<BlacklistItem> blackListItems) {
for (BlacklistItem item : blackListItems) {
persist(item);
}
}
public Map<String, List<BlacklistItem>> getBlacklistItemsCidrHashMap(List<BlacklistItem> list) {
return toHashMap(entityManager.createQuery("SELECT b FROM BlacklistItem b").getResultList());
}
private Map<String, List<BlacklistItem>> toHashMap(List<BlacklistItem> list) {
Map<String, List<BlacklistItem>> map = new HashMap<String, List<BlacklistItem>>();
String cidrBlock;
for (BlacklistItem item : list) {
if (item.getIpVersion() == IpVersion.IPV6) {
try {
cidrBlock = new IPv6Cidr().getExpandedIPv6Cidr(item.getCidrBlock());
} catch (IPStringConversionException e) {
LOG.error("Attempt to expand IPv6 string from CidrBlock " + item.getCidrBlock() + ": " + e.getMessage());
throw new IllegalArgumentException(e);
}
} else {
cidrBlock = item.getCidrBlock();
}
if (!map.containsKey(cidrBlock)) {
map.put(cidrBlock, new ArrayList<BlacklistItem>());
}
map.get(cidrBlock).add(item);
}
return map;
}
public void persist(Object obj) {
entityManager.persist(obj);
}
}