| Subscription.java |
/*
* JBossMQ, the OpenSource JMS implementation
*
* Distributable under LGPL license. See terms of license at gnu.org.
*/
package org.jboss.mq;
import java.io.Serializable;
import javax.jms.InvalidSelectorException;
import javax.jms.JMSException;
import org.jboss.mq.selectors.Selector;
/**
* This class contains all the data needed to for a the provider to to
* determine if a message can be routed to a consumer.
*
* @author Hiram Chirino (Cojonudo14@hotmail.com)
* @author David Maplesden (David.Maplesden@orion.co.nz)
* @author <a href="mailto:adrian@jboss.org">Adrian Brock</a>
* @version $Revision: 1.12.6.1 $
*/
public class Subscription implements Serializable
{
// Constants -----------------------------------------------------
/** The serialVersionID */
private static final long serialVersionUID = -4045603824932803577L;
// Attributes ----------------------------------------------------
/** This gets set to a unique value at the SpyConnection. */
public int subscriptionId;
/** The queue we want to subscribe to. */
public SpyDestination destination;
/** The selector which will filter out messages. */
public String messageSelector;
/** Should this message destroy the subscription? */
public boolean destroyDurableSubscription;
/** Topics might not want locally produced messages. */
public boolean noLocal;
/** The message selector */
public transient Selector selector;
/** The connection token */
public transient ConnectionToken connectionToken;
/** The client consumer */
public transient Object clientConsumer;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
// Public --------------------------------------------------------
/**
* Determines the consumer would accept the message.
*
* @return the selector
* @throws InvalidSelectorException for an invalid selector
*/
public Selector getSelector() throws InvalidSelectorException
{
if (messageSelector == null || messageSelector.trim().length() == 0)
return null;
if (selector == null)
selector = new Selector(messageSelector);
return selector;
}
/**
* Determines the consumer would accept the message.
*
* @param header the message header
* @return true when accepted, false otherwise
* @throws JMSException for any error
*/
public boolean accepts(SpyMessage.Header header) throws JMSException
{
if (header.jmsDestination instanceof SpyTopic && noLocal && header.producerClientId.equals(connectionToken.getClientID()))
return false;
Selector ms = getSelector();
if (ms != null && !ms.test(header))
return false;
return true;
}
/**
* Clone the subscription
*
* @return the cloned subscription
*/
public Subscription myClone()
{
Subscription result = new Subscription();
//only need to clone non-transient fields for our purposes.
result.subscriptionId = subscriptionId;
result.destination = destination;
result.messageSelector = messageSelector;
result.destroyDurableSubscription = destroyDurableSubscription;
result.noLocal = noLocal;
return result;
}
// Object overrides ----------------------------------------------
public String toString()
{
StringBuffer buffer = new StringBuffer(100);
buffer.append("Subscription[subId=").append(subscriptionId);
if (connectionToken != null)
buffer.append("connection=").append(connectionToken);
buffer.append(" destination=").append(destination);
buffer.append(" messageSelector=").append(messageSelector);
if (noLocal)
buffer.append(" NoLocal");
else
buffer.append(" Local");
if (destroyDurableSubscription)
buffer.append(" Destroy");
else
buffer.append(" Create");
buffer.append(']');
return buffer.toString();
}
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}| Subscription.java |