Index: courier-util/util/src/java/org/sakaiproject/util/BaseDelivery.java
===================================================================
--- courier-util/util/src/java/org/sakaiproject/util/BaseDelivery.java (revision 38809)
+++ courier-util/util/src/java/org/sakaiproject/util/BaseDelivery.java (working copy)
@@ -97,6 +97,7 @@
*/
public void act()
{
+ // do nothing...
}
/**
@@ -114,7 +115,7 @@
*/
public String toString()
{
- return m_address + " : " + m_elementId;
+ return businessKey();
}
/**
@@ -127,9 +128,23 @@
if (!(obj instanceof BaseDelivery)) return false;
BaseDelivery bob = (BaseDelivery) obj;
- if (StringUtil.different(bob.getAddress(), getAddress())) return false;
- if (StringUtil.different(bob.getElement(), getElement())) return false;
+ return businessKey().equals(bob.businessKey());
+ }
- return true;
+ /**
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return this.businessKey().hashCode();
}
+
+ /**
+ * Useful for equals and hashCode method implementations.
+ * @return
+ */
+ private String businessKey()
+ {
+ return m_address + ":" + m_elementId;
+ }
}
Index: courier-impl/impl/src/java/org/sakaiproject/courier/impl/BasicCourierService.java
===================================================================
--- courier-impl/impl/src/java/org/sakaiproject/courier/impl/BasicCourierService.java (revision 38809)
+++ courier-impl/impl/src/java/org/sakaiproject/courier/impl/BasicCourierService.java (working copy)
@@ -21,18 +21,17 @@
package org.sakaiproject.courier.impl;
-// imports
-import java.util.Hashtable;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.courier.api.CourierService;
import org.sakaiproject.courier.api.Delivery;
-import org.sakaiproject.util.StringUtil;
/**
*
@@ -42,10 +41,12 @@
public class BasicCourierService implements CourierService
{
/** Our logger. */
- private static Log M_log = LogFactory.getLog(BasicCourierService.class);
+ private static final Log M_log = LogFactory.getLog(BasicCourierService.class);
/** Stores a List of Deliveries for each address, keyed by address. */
- protected Map m_addresses = new Hashtable();
+ @SuppressWarnings("unchecked")
+ protected Map m_addresses =
+ new ConcurrentHashMap();
/**********************************************************************************************************************************************************************************************************************************************************
* Dependencies and their setter methods
@@ -60,8 +61,8 @@
*/
public void init()
{
+ M_log.info("init()");
m_addresses.clear();
- M_log.info("init()");
}
/**
@@ -69,8 +70,8 @@
*/
public void destroy()
{
+ M_log.info("destroy()");
m_addresses.clear();
- M_log.info("destroy()");
}
/**********************************************************************************************************************************************************************************************************************************************************
@@ -78,31 +79,31 @@
*********************************************************************************************************************************************************************************************************************************************************/
/**
- * Queue up a delivery for the client window identified in the Delivery object. The particular form of delivery is determined by the type of Delivery object sent.
+ * Queue up a delivery for the client window identified in the Delivery
+ * object. The particular form of delivery is determined by the type of
+ * Delivery object sent.
*
* @param delivery
* The Delivery (or extension) object to deliver.
*/
+ @SuppressWarnings("unchecked")
public void deliver(Delivery delivery)
{
- if (M_log.isDebugEnabled()) M_log.debug("deliver(): " + delivery);
+ if (M_log.isDebugEnabled())
+ M_log.debug("deliver(Delivery " + delivery + ")");
- String address = delivery.getAddress();
+ final String address = delivery.getAddress();
// find the entry in m_addresses
- List deliveries = (List) m_addresses.get(address);
+ List deliveries = (List) m_addresses.get(address);
// create if needed
if (deliveries == null)
{
- synchronized (m_addresses)
+ deliveries = (List) m_addresses.get(address);
+ if (deliveries == null)
{
- deliveries = (List) m_addresses.get(address);
- if (deliveries == null)
- {
- deliveries = new Vector();
- m_addresses.put(address, deliveries);
- }
+ deliveries = new ArrayList();
}
}
@@ -112,24 +113,29 @@
if (!deliveries.contains(delivery))
{
deliveries.add(delivery);
+ m_addresses.put(address, deliveries);
}
}
}
/**
- * Clear any pending delivery requests to the particular client window for this element.
+ * Clear any pending delivery requests to the particular client window for
+ * this element.
*
* @param address
* The address of the client window.
* @param elementId
* The id of the html element.
*/
+ @SuppressWarnings("unchecked")
public void clear(String address, String elementId)
{
- if (M_log.isDebugEnabled()) M_log.debug("clear(): " + address + ", " + elementId);
+ if (M_log.isDebugEnabled())
+ M_log.debug("clear(String " + address + ", String " + elementId
+ + ")");
// find the entry in m_addresses
- List deliveries = (List) m_addresses.get(address);
+ List deliveries = (List) m_addresses.get(address);
// if not there we are done
if (deliveries == null) return;
@@ -137,20 +143,17 @@
// remove any Deliveries with this elementId
synchronized (deliveries)
{
- for (Iterator it = deliveries.iterator(); it.hasNext();)
+ for (Iterator it = deliveries.iterator(); it.hasNext();)
{
- Delivery delivery = (Delivery) it.next();
- if (!StringUtil.different(delivery.getElement(), elementId))
+ Delivery delivery = it.next();
+ if (delivery.getElement().equals(elementId))
{
it.remove();
}
}
- }
- // if none left, remove it from the list
- if (deliveries.isEmpty())
- {
- synchronized (m_addresses)
+ // if none left, remove it from the list
+ if (deliveries.isEmpty())
{
m_addresses.remove(address);
}
@@ -165,13 +168,11 @@
*/
public void clear(String address)
{
- if (M_log.isDebugEnabled()) M_log.debug("clear(): " + address);
+ if (M_log.isDebugEnabled())
+ M_log.debug("clear(String " + address + ")");
// remove this portal from m_addresses
- synchronized (m_addresses)
- {
- m_addresses.remove(address);
- }
+ m_addresses.remove(address);
}
/**
@@ -181,52 +182,51 @@
* The address of client window.
* @return a List of Delivery objects addressed to this session client window.
*/
+ @SuppressWarnings("unchecked")
public List getDeliveries(String address)
{
- if (M_log.isDebugEnabled()) M_log.debug("getDeliveries(): " + address);
+ if (M_log.isDebugEnabled())
+ M_log.debug("getDeliveries(String " + address + ")");
// find the entry in m_addresses
- List deliveries = null;
- synchronized (m_addresses)
+ List deliveries = (List) m_addresses.get(address);
+ if (deliveries == null) // if null, return something
{
- deliveries = (List) m_addresses.get(address);
- if (deliveries != null)
+ return Collections.EMPTY_LIST; // this should return null!
+ }
+ else
+ {
+ m_addresses.remove(address);
+
+ synchronized (deliveries)
{
- m_addresses.remove(address);
+ // "act" all the deliveries
+ for (Delivery delivery : deliveries)
+ {
+ delivery.act();
+ }
}
+ return deliveries;
}
-
- // if empty, return something
- if (deliveries == null)
- {
- deliveries = new Vector();
- }
-
- synchronized (deliveries)
- {
- // "act" all the deliveries
- for (Iterator it = deliveries.iterator(); it.hasNext();)
- {
- Delivery delivery = (Delivery) it.next();
- delivery.act();
- }
- }
- return deliveries;
}
/**
- * Check to see if there are any deliveries queued up for a particular session client window.
+ * Check to see if there are any deliveries queued up for a particular
+ * session client window.
*
* @param address
- * The address of the client window.
- * @return true if there are deliveries for this client window, false if not.
+ * The address of the client window.
+ * @return true if there are deliveries for this client window, false if
+ * not.
*/
+ @SuppressWarnings("unchecked")
public boolean hasDeliveries(String address)
{
- if (M_log.isDebugEnabled()) M_log.debug("hasDeliveries(): " + address);
+ if (M_log.isDebugEnabled())
+ M_log.debug("hasDeliveries(String " + address + ")");
// find the entry in m_addresses
- List deliveries = (List) m_addresses.get(address);
+ List deliveries = (List) m_addresses.get(address);
if (deliveries == null) return false;
return (!deliveries.isEmpty());