package tw.com.entity;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tw.com.SetsDeltaIndex;
import tw.com.exceptions.CannotFindVpcException;
public class DeletionsPending implements Iterable<DeletionPending> {
private static final Logger logger = LoggerFactory.getLogger(DeletionsPending.class);
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((deleted == null) ? 0 : deleted.hashCode());
result = prime * result + ((items == null) ? 0 : items.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DeletionsPending other = (DeletionsPending) obj;
if (deleted == null) {
if (other.deleted != null)
return false;
} else if (!deleted.equals(other.deleted))
return false;
if (items == null) {
if (other.items != null)
return false;
} else if (!items.equals(other.items))
return false;
return true;
}
@Override
public String toString() {
return "DeletionsPending [items=" + items + "]";
}
LinkedList<DeletionPending> items;
LinkedList<DeletionPending> deleted;
public DeletionsPending() {
items = new LinkedList<DeletionPending>();
deleted = new LinkedList<DeletionPending>();
}
public void add(int delta, StackNameAndId stackId) {
DeletionPending item = new DeletionPending(delta, stackId);
items.add(item);
}
@Override
public Iterator<DeletionPending> iterator() {
Collections.sort(items);
return items.iterator();
}
public void markIdAsDeleted(String stackId) {
for(DeletionPending item : items) {
StackNameAndId itemStackId = item.getStackId();
if (itemStackId.getStackId().equals(stackId)) {
logger.info(String.format("Matched stackid %s, marking stack as deleted", stackId));
deleted.add(item);
return;
}
}
}
public boolean hasMore() {
return deleted.size()<items.size();
}
public void updateDeltaIndex(SetsDeltaIndex setsDeltaIndex) throws CannotFindVpcException {
if (deleted.size()==0) {
logger.warn("Failed to delete any stacks");
return;
}
int lowest = deleted.get(0).getDelta()-1;
for(DeletionPending update : deleted) {
int delta = update.getDelta()-1;
if (delta<lowest) {
lowest=delta;
}
}
logger.info(String.format("Updating delta index to %s", lowest));
setsDeltaIndex.setDeltaIndex(lowest);
}
public List<String> getNamesOfDeleted() {
List<String> names = new LinkedList<String>();
for(DeletionPending update : deleted) {
names.add(update.getStackId().getStackName());
}
return names;
}
}