import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;
import com.roboclub.robobuggy.ros.Message;
import com.roboclub.robobuggy.ros.MessageListener;
import com.roboclub.robobuggy.ros.Node;
import com.roboclub.robobuggy.ros.Subscriber;
public class UnboundedQueueNumberSink implements Node {
private Subscriber s;
private Semaphore sem = new Semaphore(1);
private AtomicInteger count = new AtomicInteger(1);
public UnboundedQueueNumberSink(String topicName, int numMessages) {
try {
sem.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
s = new Subscriber("unboundedSink", topicName, new MessageListener() {
@Override
public void actionPerformed(String topicName, Message m) {
IntegerMessage im = (IntegerMessage) m;
int val = count.getAndIncrement();
if (val != im.val) {
System.out.println("For an unbounded queue, the sum of dropped"
+ " messages and our counter must equal the published messages.");
}
if ((val + 1) == numMessages) {
sem.release();
System.out.println("NumSink exiting...");
return;
}
}
});
}
@Override
public boolean shutdown() {
s.close();
return true;
}
@Override
public boolean startNode() {
return false;
}
@Override
public void setName(String newName) {
System.out.println("tried to set name");
}
@Override
public String getName() {
return null;
}
public int blockUntilDone() {
try {
sem.acquire();
} catch (InterruptedException e) {
assert (false);
}
return count.get();
}
}