package com.cgcl.cloudesk.manage.com;
/**
* Queue Entry
*/
class QueueEntry {
private Object data = null;
public QueueEntry prev = null;
public QueueEntry next = null;
public QueueEntry(Object data)
{
this.data = data;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
/**
* Queue implemented with the style of FIFO
* Thread-safe
*/
public class Queue {
QueueEntry first = null;
QueueEntry last = null;
/**
* Is the queue empty
* @return true if empty, otherwise not
*/
public synchronized boolean isEmpty()
{
if(null == first)
{
return true;
}
else
{
return false;
}
}
/**
* Returns the size of the queue
* @returns size of the queue
*/
public synchronized int size()
{
if(null == first)
{
return 0;
}
int size = 1;
QueueEntry qe = first;
while(qe != last)
{
qe = qe.next;
++size;
}
return size;
}
/**
* Pushes an item to the queue
* @params data Object to push into the queue
*/
public synchronized void push(Object data)
{
QueueEntry qe = new QueueEntry(data);
if(null == first)
{
first = last = qe;
}
else
{
qe.next = first;
first.prev = qe;
first = qe;
}
}
/**
* Pops an item from the queue
* @returns Object to data referenced by the last item
*/
public synchronized Object pop()
{
if(null == first)
{
return null;
}
QueueEntry qe = last;
if(first == last)
{
first = last = null;
return qe.getData();
}
last = last.prev;
last.next = null;
qe.prev = null;
return qe.getData();
}
/**
* Clears the queue
*/
public synchronized void clear()
{
QueueEntry pre = first;
QueueEntry post = null;
while(null != pre)
{
post = pre.next;
pre.setData(null);
pre.prev = pre.next = null;
pre = post;
}
first = last = null;
}
}