/*******************************************************************************
* Copyright (c) 2010-2012, Tamas Szabo, Abel Hegedus, Istvan Rath and Daniel Varro
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tamas Szabo, Abel Hegedus - initial API and implementation
*******************************************************************************/
package org.eclipse.incquery.runtime.triggerengine.firing;
import org.eclipse.incquery.runtime.api.IPatternMatch;
import org.eclipse.incquery.runtime.triggerengine.api.Activation;
import org.eclipse.incquery.runtime.triggerengine.api.ActivationMonitor;
/**
* A timed firing strategy is similar to the {@link AutomaticFiringStrategy} as it also fires all the applicable
* activations but it does so in a periodic manner. One must define the interval between two consecutive firings.
*
* @author Tamas Szabo
*
*/
public class TimedFiringStrategy {
private long interval;
private volatile boolean interrupted = false;
private ActivationMonitor monitor;
private FiringThread firingThread;
public TimedFiringStrategy(ActivationMonitor monitor, long interval) {
this.interval = interval;
this.monitor = monitor;
this.firingThread = new FiringThread();
}
public void start() {
this.firingThread.start();
}
private class FiringThread extends Thread {
public FiringThread() {
this.setName("TimedFiringStrategy [interval: " + interval + "]");
}
@Override
public void run() {
while (!interrupted) {
for (Activation<? extends IPatternMatch> a : monitor.getActivations()) {
a.fire();
}
monitor.clear();
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
// e.printStackTrace();
}
}
}
}
public void dispose() {
interrupted = true;
}
}