/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.datasource.integration;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.diirt.datasource.PVReader;
import org.diirt.datasource.PVReaderEvent;
import org.diirt.datasource.PVReaderListener;
/**
*
* @author carcassi
*/
public abstract class PVReaderCondition<T> {
abstract public boolean accept(PVReader<T> reader, PVReaderEvent<T> event);
public boolean waitOn(PVReader<T> reader, int msTimeout) {
final CountDownLatch latch = new CountDownLatch(1);
reader.addPVReaderListener(new PVReaderListener<T>() {
@Override
public void pvChanged(PVReaderEvent<T> event) {
if (accept(event.getPvReader(), event)) {
latch.countDown();
event.getPvReader().removePVReaderListener(this);
}
}
});
if (accept(reader, null)) {
latch.countDown();
}
try {
return latch.await(msTimeout, TimeUnit.MILLISECONDS);
} catch (InterruptedException ex) {
Logger.getLogger(PVReaderCondition.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
}