package hu.bme.mit.incquery.cep.api.eventprocessingstrategy;
import hu.bme.mit.incquery.cep.api.runtime.EventModelManager;
import hu.bme.mit.incquery.cep.metamodels.internalsm.EventToken;
import hu.bme.mit.incquery.cep.metamodels.internalsm.State;
import hu.bme.mit.incquery.cep.metamodels.internalsm.StateMachine;
import hu.bme.mit.incquery.cep.metamodels.internalsm.TimeConstraint;
import hu.bme.mit.incquery.cep.metamodels.internalsm.TimeConstraintSpecification;
import hu.bme.mit.incquery.cep.metamodels.internalsm.TrapState;
import hu.bme.mit.incquery.cep.runtime.evaluation.SMUtils;
import java.util.Calendar;
import org.eclipse.emf.common.util.EList;
import com.google.common.base.Preconditions;
public abstract class AbstractEventProcessingStrategy implements IEventProcessingStrategy {
private EventModelManager eventModelManager;
public AbstractEventProcessingStrategy(EventModelManager eventModelManager) {
this.eventModelManager = eventModelManager;
}
protected EventModelManager getEventModelManager() {
return this.eventModelManager;
}
protected long getCurrentTimeStamp() {
Calendar c = Calendar.getInstance();
return c.getTimeInMillis();
}
protected boolean handleTimeConstraints(EventToken eventToken, State nextState) {
EList<TimeConstraint> timeConstraints = nextState.getTimeConstraints();
if (timeConstraints.isEmpty())
return true;
for (TimeConstraint timeConstraint : timeConstraints) {
TimeConstraintSpecification timeConstraintSpecification = timeConstraint.getTimeConstraintSpecification();
Preconditions.checkArgument(timeConstraintSpecification != null);
switch (timeConstraint.getType()) {
case START:
timeConstraint.getTimeConstraintSpecification().setStartTimestamp(getCurrentTimeStamp());
continue;
case STOP:
timeConstraint.getTimeConstraintSpecification().setStopTimestamp(getCurrentTimeStamp());
if (!isTimeConstraintSatisfied(timeConstraint)) {
moveToTrapState(eventToken);
return false;
}
continue;
case CHECK:
tryStart(timeConstraintSpecification);
if (!isTimeConstraintSatisfied(timeConstraint)) {
moveToTrapState(eventToken);
return false;
}
continue;
}
}
return true;
}
private void tryStart(TimeConstraintSpecification timeConstraintSpecification) {
if (timeConstraintSpecification.getStartTimestamp() == 0l) {
timeConstraintSpecification.setStartTimestamp(getCurrentTimeStamp());
}
}
protected void moveToTrapState(EventToken eventToken) {
Preconditions.checkArgument(eventToken.getCurrentState().eContainer() instanceof StateMachine);
StateMachine sm = (StateMachine) eventToken.getCurrentState().eContainer();
TrapState trapState = SMUtils.getTrapState(sm);
Preconditions.checkNotNull(trapState);
eventToken.setCurrentState(trapState);
}
protected boolean isTimeConstraintSatisfied(TimeConstraint constraint) {
long start = constraint.getTimeConstraintSpecification().getStartTimestamp();
long stop = constraint.getTimeConstraintSpecification().getStopTimestamp();
long expected = constraint.getTimeConstraintSpecification().getExpectedLength();
if (start == 0l || expected == 0l) {
return true;
}
if (stop != 0l) {
if (stop - start < expected) {
return true;
}
}
if (stop == 0l) {
if (getCurrentTimeStamp() - start < expected) {
return true;
}
}
return false;
}
}