package ch.loway.oss.ari4java.tools; import ch.loway.oss.ari4java.ARI; import ch.loway.oss.ari4java.generated.Message; import java.util.LinkedList; import java.util.List; /** * This is a thread-safe data structure that acts as a communication channel * for events. * * @author lenz */ public class MessageQueue { public List<Message> lEvents = new LinkedList<Message>(); /** * Adds a message to the queue. * * @param msg */ public synchronized void queue( Message msg ) { lEvents.add(msg); } /** * Adds an error to the queue, using a specilized message pleceholder. * * @param error */ public void queueError( String error ) { ErrorMessage err = new ErrorMessage(); err.setType(error); queue(err); } /** * Remove a message from the queue. This return immediately - * if no message found, return null. * * @return the message just removed. */ public synchronized Message dequeue() { if ( lEvents.isEmpty() ) { return null; } else { Message e = lEvents.get(0); lEvents.remove(0); return e; } } /** * Gets a message from the queue. If no message found, wait up to * a 'max' of ms polling every 'interval' ms. * This method in NOT synchronized - it only locks when calling dequeue(). * * @param max * @param interval * @return the message. */ public Message dequeueMax( int max, int interval ) { long endAfter = System.currentTimeMillis() + max; while ( System.currentTimeMillis() < endAfter ) { Message m = dequeue(); if ( m != null ) { return m; } else { ARI.sleep(interval); } } return null; } /* * How many messages are queued? */ public synchronized int size() { return lEvents.size(); } /** * A placeholder for error messages. * */ public static class ErrorMessage implements Message { String type = ""; String asterisk_id = ""; @Override public void setType(String val) { this.type=val; } @Override public String getType() { return this.type; } @Override public void setAsterisk_id(String val) { this.asterisk_id = val; } @Override public String getAsterisk_id() { return this.asterisk_id; } } }