package com.jbidwatcher.util.queue; /* * Copyright (c) 2000-2007, CyberFOX Software, Inc. All Rights Reserved. * * Developed by mrs (Morgan Schweers) */ import java.util.*; import java.beans.*; import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; import com.jbidwatcher.util.Currency; public abstract class MessageQueue implements Runnable { protected final LinkedList<Object> _queue = new LinkedList<Object>(); protected List<MessageQueue.Listener> _listeners = new ArrayList<Listener>(1); protected abstract void handleListener(); public interface Listener { void messageAction(Object deQ); } /** * registerListener treats the message queue as if it is a 1-entry list, * replacing all existing listeners (expected to be one or zero) with the * newly passed in listener. * * @param ml - The new listener to be notified of events on this queue. * * @return The old listener that was being notified of events on this queue. */ public Listener registerListener(MessageQueue.Listener ml) { Listener old = _listeners.isEmpty() ? null : _listeners.get(0); _listeners.clear(); _listeners.add(ml); handleListener(); return old; } // TODO -- Should end up only allowing String and XMLEncode'able objects (which get converted to a String?). public abstract boolean enqueue(String objToEnqueue); // Maybe XML queues are different? MQFactory.getXMLQueue()? public void enqueueBean(QObject xe) { // Create output stream. ByteArrayOutputStream fos = new ByteArrayOutputStream(); XMLEncoder xe2 = new XMLEncoder(fos); xe2.setPersistenceDelegate(Currency.class, Currency.getDelegate()); xe2.writeObject(xe); xe2.close(); enqueue(fos.toString()); } private Object convertBean(String obj) { ByteArrayInputStream fis = new ByteArrayInputStream(obj.getBytes()); XMLDecoder xd = new XMLDecoder(fis); Object rval = xd.readObject(); xd.close(); return rval; } public Object dequeue() { Object out; synchronized(_queue) { out = _queue.removeFirst(); } if(out instanceof String) { if( ((String)out).contains("java.beans.XMLDecoder") ) { out = convertBean((String)out); } } return out; } public void clear() { synchronized(_queue) { _queue.clear(); } } public void removeListener(Listener listener) { _listeners.remove(listener); } public void addListener(Listener listener) { _listeners.add(listener); } }