package org.ourgrid.system.condition;
import java.util.Map;
import java.util.Set;
import org.ourgrid.broker.status.WorkerStatusInfo;
import org.ourgrid.system.units.BrokerUnit;
public class BrokerNumberOfWorkersCondition implements Condition {
private final int jobid;
private final int numWorkersExpected;
private final BrokerUnit brokerUnit;
private int actualNumWorkers;
public BrokerNumberOfWorkersCondition( BrokerUnit brokerUnit, int numWorkers, int jobid ) {
this.jobid = jobid;
this.numWorkersExpected = numWorkers;
this.brokerUnit = brokerUnit;
this.actualNumWorkers = -1;
}
public BrokerNumberOfWorkersCondition( BrokerUnit brokerUnit, int numWorkers ) {
this( brokerUnit, numWorkers, -1 );
}
public boolean isConditionMet() throws Exception {
Map<Integer,Set<WorkerStatusInfo>> workers = brokerUnit.getWorkersByJob();
this.actualNumWorkers = 0;
// No job has been specified
if ( jobid == -1 ) {
for ( Set<WorkerStatusInfo> set : workers.values() ) {
actualNumWorkers += set.size();
}
return actualNumWorkers == numWorkersExpected;
}
final Set<WorkerStatusInfo> jobWorkers = workers.get( jobid );
if ( jobWorkers == null ) {
throw new Exception( "Job " + jobid + " does not exist" );
}
actualNumWorkers = jobWorkers.size();
return actualNumWorkers == numWorkersExpected;
}
public String detailMessage() {
return "Number of workers expected: [" + numWorkersExpected + "]. Actual: [" + actualNumWorkers + "]";
}
}