package org.jboss.mq.sm;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.jms.InvalidClientIDException;
import javax.jms.InvalidDestinationException;
import javax.jms.JMSException;
import javax.jms.JMSSecurityException;
import org.jboss.mq.DurableSubscriptionID;
import org.jboss.mq.SpyTopic;
import org.jboss.mq.server.JMSDestinationManager;
import org.jboss.mq.server.JMSTopic;
import org.jboss.system.ServiceMBeanSupport;
public abstract class AbstractStateManager extends ServiceMBeanSupport
implements StateManager, AbstractStateManagerMBean
{
private final Set loggedOnClientIds = new HashSet();
public AbstractStateManager()
{
}
public void setDurableSubscription(JMSDestinationManager server, DurableSubscriptionID sub, SpyTopic topic)
throws JMSException
{
boolean debug = log.isDebugEnabled();
if (debug)
log.debug("Checking durable subscription: " + sub + ", on topic: " + topic);
DurableSubscription subscription = getDurableSubscription(sub);
if (subscription == null)
{
if (debug)
log.debug("The subscription was not previously registered.");
if (topic == null)
{
return;
}
JMSTopic dest = (JMSTopic) server.getJMSDestination(topic);
dest.createDurableSubscription(sub);
subscription = new DurableSubscription(sub.getClientID(), sub.getSubscriptionName(), topic.getName(), sub
.getSelector());
saveDurableSubscription(subscription);
}
else
{
if (debug)
log.debug("The subscription was previously registered.");
String newSelector = sub.getSelector();
String oldSelector = subscription.getSelector();
boolean selectorChanged = false;
if ((newSelector == null && oldSelector != null)
|| (newSelector != null && newSelector.equals(oldSelector) == false))
selectorChanged = true;
if (topic == null)
{
if (debug)
log.debug("Removing subscription.");
SpyTopic prevTopic = new SpyTopic(subscription.getTopic());
JMSTopic dest = (JMSTopic) server.getJMSDestination(prevTopic);
dest.destroyDurableSubscription(sub);
removeDurableSubscription(subscription);
}
else if (!subscription.getTopic().equals(topic.getName()) || selectorChanged)
{
if (debug)
log.debug("But the topic or selector was different, changing the subscription.");
SpyTopic prevTopic = new SpyTopic(subscription.getTopic());
JMSTopic dest = (JMSTopic) server.getJMSDestination(prevTopic);
dest.destroyDurableSubscription(sub);
dest = (JMSTopic) server.getJMSDestination(topic);
dest.createDurableSubscription(sub);
subscription.setTopic(topic.getName());
subscription.setSelector(sub.getSelector());
saveDurableSubscription(subscription);
}
}
}
public SpyTopic getDurableTopic(DurableSubscriptionID sub) throws JMSException
{
DurableSubscription subscription = getDurableSubscription(sub);
if (subscription == null)
throw new InvalidDestinationException("No durable subscription found for subscription: "
+ sub.getSubscriptionName());
return new SpyTopic(subscription.getTopic());
}
public String checkUser(String login, String passwd) throws JMSException
{
String clientId = getPreconfClientId(login, passwd);
if (clientId != null)
{
synchronized (loggedOnClientIds)
{
if (loggedOnClientIds.contains(clientId))
{
throw new JMSSecurityException
("The login id has an assigned client id '" + clientId +
"', that is already connected to the server!");
}
loggedOnClientIds.add(clientId);
}
}
return clientId;
}
public void addLoggedOnClientId(String ID) throws JMSException
{
synchronized (loggedOnClientIds)
{
if (loggedOnClientIds.contains(ID))
throw new InvalidClientIDException("This client id '" + ID + "' is already registered!");
}
checkLoggedOnClientId(ID);
synchronized (loggedOnClientIds)
{
loggedOnClientIds.add(ID);
}
if (log.isTraceEnabled())
log.trace("Client id '" + ID + "' is logged in.");
}
public void removeLoggedOnClientId(String ID)
{
synchronized (loggedOnClientIds)
{
loggedOnClientIds.remove(ID);
}
if (log.isTraceEnabled())
log.trace("Client id '" + ID + "' is logged out.");
}
abstract public Collection getDurableSubscriptionIdsForTopic(SpyTopic topic) throws JMSException;
abstract protected String getPreconfClientId(String login, String passwd) throws JMSException;
abstract protected void checkLoggedOnClientId(String clientID) throws JMSException;
abstract protected DurableSubscription getDurableSubscription(DurableSubscriptionID sub) throws JMSException;
abstract protected void saveDurableSubscription(DurableSubscription ds) throws JMSException;
abstract protected void removeDurableSubscription(DurableSubscription ds) throws JMSException;
protected class DurableSubscription
{
String clientID;
String name;
String topic;
String selector;
public DurableSubscription()
{
}
public DurableSubscription(String clientID, String name, String topic, String selector)
{
this.clientID = clientID;
this.name = name;
this.topic = topic;
this.selector = selector;
}
public String getClientID()
{
return clientID;
}
public String getName()
{
return name;
}
public String getTopic()
{
return topic;
}
public void setTopic(String topic)
{
this.topic = topic;
}
public String getSelector()
{
return selector;
}
public void setSelector(String selector)
{
this.selector = selector;
}
}
}