QueueAdapter.java
package eu.javaexperience.collection.queue;
import java.util.Map;
import java.util.Queue;
import java.util.Map.Entry;
import eu.javaexperience.collection.PublisherCollection;
public class QueueAdapter<T> extends PublisherCollection<T> implements Queue<T>
{
protected Map<String, T> backend;
public QueueAdapter(Map<String, T> backend)
{
this.backend = backend;
for(Entry<String, T> kv:backend.entrySet())
{
if(null != kv.getValue())
{
int val = Integer.parseInt(kv.getKey());
lastVal = Math.max(lastVal, val);
if(firstVal == -1)
{
firstVal = val;
}
else
{
firstVal = Math.min(firstVal, val);
}
}
}
}
protected int lastVal = 0;
protected int firstVal = -1;
@Override
public boolean offer(T e)
{
return add(e);
}
@Override
public T remove()
{
T ret = poll();
assertNotEmpty(ret);
return ret;
}
@Override
public T element()
{
T ret = peek();
assertNotEmpty(ret);
return ret;
}
protected void assertNotEmpty(T elem)
{
if(null == elem)
{
throw new IllegalStateException("Queue is empty");
}
}
@Override
public T peek()
{
synchronized (backend)
{
String key = String.valueOf(firstVal);
return backend.get(key);
}
}
@Override
public T poll()
{
synchronized(backend)
{
String key = String.valueOf(firstVal++);
T ret = backend.get(key);
backend.remove(key);
return ret;
}
}
@Override
public boolean add(T obj)
{
synchronized (backend)
{
backend.put(String.valueOf(lastVal++), obj);
}
return true;
}
}