/*
* Copyright 2011 Michael Bedward
*
* This file is part of jai-tools.
*
* jai-tools is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* jai-tools is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with jai-tools. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.jgrasstools.gears.modules.r.mapcalc;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.jaitools.CollectionFactory;
import org.jaitools.jiffle.runtime.JiffleEvent;
import org.jaitools.jiffle.runtime.JiffleEventListener;
import org.jaitools.jiffle.runtime.JiffleExecutorResult;
/**
* An event listener that uses a {@code CountDownLatch} to force the client to
* wait for the expected number of tasks to be completed.
*
* @author Michael Bedward
* @since 1.1
* @version $Id$
*/
public class WaitingListener implements JiffleEventListener {
private CountDownLatch latch = null;
private final List<JiffleExecutorResult> results = CollectionFactory.list();
/**
* Sets the number of task completions and/or failures to wait for.
*
* @param n number of tasks
*/
public void setNumTasks(int n) {
if (latch != null && latch.getCount() > 0) {
throw new IllegalStateException("Method called during wait period");
}
latch = new CountDownLatch(n);
}
/**
* Waits for tasks to finish.
*/
public boolean await(long timeOut, TimeUnit units) {
if (latch == null) {
throw new RuntimeException("Called await without setting number of tasks");
}
try {
boolean isZero = latch.await(timeOut, units);
if (!isZero) {
return false;
}
return true;
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}
public void await() {
if (latch == null) {
throw new RuntimeException("Called await without setting number of tasks");
}
try {
latch.await();
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}
public List<JiffleExecutorResult> getResults() {
return results;
}
public void onCompletionEvent(JiffleEvent ev) {
JiffleExecutorResult result = ev.getResult();
results.add(result);
latch.countDown();
}
public void onFailureEvent(JiffleEvent ev) {
JiffleExecutorResult result = ev.getResult();
results.add(result);
latch.countDown();
}
}