package eu.play_project.dcep.distributedetalis.measurement;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Callable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.play_project.dcep.api.measurement.MeasurementResult;
import eu.play_project.dcep.api.measurement.NodeMeasurementResult;
import eu.play_project.dcep.api.measurement.PatternMeasuringResult;
import eu.play_project.dcep.distributedetalis.PlayJplEngineWrapper;
import eu.play_project.dcep.distributedetalis.api.DistributedEtalisException;
public class MeasurementThread implements Callable<MeasurementResult> {
private final Logger logger;
private int measuringPeriod = 0;
private final PlayJplEngineWrapper ctx; // CEP-Engine
private final MeasurementUnit mainProgramm;
public MeasurementThread(int measuringPeriod, PlayJplEngineWrapper ctx, MeasurementUnit mainProgramm) {
logger = LoggerFactory.getLogger(MeasurementThread.class);
this.measuringPeriod = measuringPeriod;
this.mainProgramm = mainProgramm;
this.ctx = ctx;
}
@Override
public NodeMeasurementResult call() throws Exception {
logger.debug("Start new measurement peride with " + measuringPeriod + "ms");
ctx.executeGoal("setMeasurementMode(on)");
// Wait till measurement time is up. Send triger 5 measurements.
int measureEvents = eu.play_project.dcep.distributedetalis.measurement.MeasurementUnit.eventsPeriod ;// Number of measurement events in one period.
float partMPeriod = (measuringPeriod/measureEvents-10);
while(partMPeriod <= measuringPeriod){
// Send measuring event.
mainProgramm.sendMeasureEvents();
// Note that event has been sent.
partMPeriod += measuringPeriod/measureEvents;
// Wait
Thread.sleep((measuringPeriod/measureEvents));
}
// Stop measurement
ctx.executeGoal("setMeasurementMode(off)");
logger.debug("Measurement mode: off");
// Next state
mainProgramm.measuringPeriodIsUp();
// Get measured data.
logger.debug("Get measured data form prolog.");
NodeMeasurementResult values = getMeasuredValues();
// Cleanup
logger.debug("Delete measured data.");
ctx.executeGoal("deleteMeasuredData");
//
mainProgramm.setMeasuredValues(values);
logger.info("Measurement periode is up.");
// Return result.
return values;
}
public NodeMeasurementResult getMeasuredValues() {
logger.debug("getMeasuredValues");
StringBuffer comand = new StringBuffer();
Hashtable<String, Object>[] resultFromProlog = null;
List<PatternMeasuringResult> results = null;
comand.append("eventCounter(PatternID,Value)");
// Get patternIDs and values
try {
resultFromProlog = ctx.execute(comand.toString());
} catch (DistributedEtalisException e) {
logger.warn("Problem occurred while getting eventCounter: " + e.getMessage());
}
// Create result object
if (resultFromProlog != null) {
results = new LinkedList<PatternMeasuringResult>();
for (Hashtable<String, Object> hashtable : resultFromProlog) {
logger.info("Pattern " + hashtable.get("PatternID").toString() + " consumed " + ((jpl.Integer) hashtable.get("Value")).intValue() + " events.");
// Put data in ResultSet.
results.add(new PatternMeasuringResult(hashtable.get("PatternID").toString(), ((jpl.Integer) hashtable.get("Value")).intValue()));
}
}
if (results == null) {
logger.error("No measuring results");
}
return new NodeMeasurementResult("DummyETALIS-NodeName", measuringPeriod, results);
}
}