package org.ovirt.engine.core.bll.pm;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.pm.FenceAgent;
public class PowerManagementHelper {
/**
* Get an iterator over the fencing-agents of this host. Agents are returned sorted by their 'order' attribute -
* lowest order first, highest order last.
*/
public static AgentsIterator getAgentsIterator(List<FenceAgent> fenceAgents) {
orderAgents(fenceAgents);
return new AgentsIterator(fenceAgents);
}
public static void orderAgents(List<FenceAgent> fenceAgents) {
synchronized (fenceAgents) {
Collections.sort(fenceAgents, new FenceAgent.FenceAgentOrderComparator());
}
}
public static class AgentsIterator implements Iterator<List<FenceAgent>> {
private List<FenceAgent> agents; // assumes agents are ordered.
int pos;
int size;
public AgentsIterator(List<FenceAgent> agents) {
super();
pos = 0;
size = agents.size();
this.agents = agents;
}
@Override
public boolean hasNext() {
return size >= (pos + 1);
}
@Override
public List<FenceAgent> next() {
List<FenceAgent> agentsWithSameOrder = new LinkedList<>();
FenceAgent agent = agents.get(pos);
agentsWithSameOrder.add(agent);
pos += 1;
int order = agent.getOrder();
while (pos < agents.size()) {
agent = agents.get(pos);
if (agent.getOrder() == order) {
agentsWithSameOrder.add(agent);
pos += 1;
} else {
break;
}
}
return agentsWithSameOrder;
}
@Override
public void remove() {
// never used, no need to implement.
throw new UnsupportedOperationException();
}
}
}