package eu.play_project.dcep.distributedetalis.measurement.fsm; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.hp.hpl.jena.graph.NodeFactory; import com.hp.hpl.jena.vocabulary.RDF; import eu.play_project.dcep.api.measurement.NodeMeasurementResult; import eu.play_project.dcep.distributedetalis.DistributedEtalis; import eu.play_project.dcep.distributedetalis.PrologSemWebLib; import eu.play_project.dcep.distributedetalis.measurement.MeasurementUnit; import eu.play_project.dcep.api.measurement.*; import fr.inria.eventcloud.api.CompoundEvent; import fr.inria.eventcloud.api.Quadruple; public class MeasureProcessingTime implements MeasurementState{ private final MeasurementUnit context; private final PrologSemWebLib semWebLib; private final DistributedEtalis cepEngine; private final Logger logger; private int measurementEventCounter = 0; private int complexEventCounter = 0; private int measurementCounter = 0; // Count how often events were sent. public MeasureProcessingTime( MeasurementUnit context, DistributedEtalis cepEngine, PrologSemWebLib semWebLib){ this.cepEngine = cepEngine; this.semWebLib = semWebLib; this.context = context; this.logger = LoggerFactory.getLogger(MeasureProcessingTime.class); } @Override public void sendMeasuringEvent() { int mEvents = MeasurementUnit.mEvents; // Send 10 measuring events. logger.info("Send measurement events: " + mEvents ); // Generate m events with current time. long currentTime = System.nanoTime(); measurementCounter++; for (int i = 0; i < mEvents; i++) { CompoundEvent mEvent = generateMeasuringEvent((i + measurementCounter), currentTime); // Skip ProActive queue. try { semWebLib.addEvent(mEvent); } catch (Exception e) { e.printStackTrace(); } //cepEngine.notify(this.getSimpleEventType(mEvent), mEvent.getGraph().toString()); cepEngine.publish(mEvent); } } @Override public void eventProduced(CompoundEvent event, String type) { // Count events. if(type.equals("org/types/ComplexMeasurementEvent'")){ logger.debug("New complex m event received. "); measurementEventCounter++; //Use time of MeasurementUnit.mEvents if(measurementEventCounter%MeasurementUnit.mEvents ==0){ context.addSingleEventTime(calcTimeForEvent(event)); } //Check if all measurements are received. if(measurementEventCounter==(MeasurementUnit.mEvents * eu.play_project.dcep.distributedetalis.measurement.MeasurementUnit.eventsPeriod)){ //context.setNumberOfInputEvents(context.getNumberOfInputEvents() + numberOfConsumedEvents); } }else{ complexEventCounter++; } } @Override public void measuringPeriodIsUp() { logger.debug("Switch state"); logger.info(measurementEventCounter + "Measurements received. " + MeasurementUnit.mEvents * eu.play_project.dcep.distributedetalis.measurement.MeasurementUnit.eventsPeriod + "Events expected."); if(measurementEventCounter>=((eu.play_project.dcep.distributedetalis.measurement.MeasurementUnit.eventsPeriod)-1)){ MeasurementState s = new WaitForMeasuredData(context); context.setState(s); //Set number of consumed and produced events. context.setNumberOfOutputEvents(context.getNumberOfOutputEvents()+complexEventCounter); }else { MeasurementState s = new WaitForComplexMeasurementEvent(context, complexEventCounter); context.setState(s); } } @Override public void eventReceived() { context.setNumberOfInputEvents(1); //Count first event after startup. // Set next state. //this.context.setState(context.create("WaitForComplexMeasurementEvents")); } @Override public NodeMeasurementResult getMeasuringResults() { return null; //Reflexive edge. } @Override public void startMeasurement(int period) { //Reflexive edge. } private CompoundEvent generateMeasuringEvent(int measurementID, long time){ //Measure time for one event. List<Quadruple> quads = new ArrayList<Quadruple>(); Quadruple q1 = new Quadruple( NodeFactory.createURI("http://play-project.eu/measurement/" + measurementID), NodeFactory.createURI("http://play-project.eu/measurement/event"), RDF.type.asNode(), NodeFactory.createURI(MeasurementConstants.MEASUREMENT_SIMPLE_TYPE) ); Quadruple q2 = new Quadruple( NodeFactory.createURI("http://play-project.eu/measurement/" + measurementID), NodeFactory.createURI("http://play-project.eu/measurement/event"), NodeFactory.createURI("http://events.event-processing.org/types/stream"), NodeFactory.createURI("http://streams.event-processing.org/ids/Local#stream") ); Quadruple q3 = new Quadruple( NodeFactory.createURI("http://play-project.eu/measurement/" + measurementID), NodeFactory.createURI("http://play-project.eu/measurement/event"), NodeFactory.createURI("http://events.event-processing.org/types/sendTime"), NodeFactory.createURI(time + "") ); Quadruple q4 = new Quadruple( NodeFactory.createURI("http://play-project.eu/measurement/" + measurementID), NodeFactory.createURI("http://play-project.eu/measurement/event"), NodeFactory.createURI("http://events.event-processing.org/types/payload"), NodeFactory.createURI("payload") ); quads.add(q1); quads.add(q2); quads.add(q3); quads.add(q4); return new CompoundEvent(quads); } @Override public void setMeasuredData(NodeMeasurementResult measuredValues) { } @Override public String getName() { return "MeasureProcessingTime"; } private long calcTimeForEvent(CompoundEvent event) { long singleEventTime = 0; // Calc processint time for one event Long currentTime = System.nanoTime(); for (Quadruple quadruple : event) { if (quadruple.getPredicate().toString().equals("http://play-project.eu/timeOneEvent")) { singleEventTime = currentTime - Long.valueOf(quadruple.getObject().toString()); singleEventTime = (singleEventTime/ MeasurementUnit.mEvents); logger.info("Time for" + MeasurementUnit.mEvents + " events ------------------------" + singleEventTime); } } return singleEventTime; } }