package org.jboss.axis.transport.jms;
import org.jboss.axis.AxisEngine;
import org.jboss.axis.AxisFault;
import org.jboss.axis.MessageContext;
import org.jboss.axis.client.Call;
import org.jboss.axis.client.Transport;
import org.jboss.axis.utils.Messages;
import org.jboss.logging.Logger;
import javax.jms.Destination;
import java.util.HashMap;
import java.util.Iterator;
public class JMSTransport extends Transport
{
protected static Logger log = Logger.getLogger(JMSTransport.class);
private HashMap connectors;
private HashMap connectorProps;
private HashMap connectionFactoryProps;
private JMSConnector defaultConnector;
private HashMap passwords;
private Object connectorLock;
public JMSTransport(HashMap connectorProps,
HashMap connectionFactoryProps)
{
transportName = "JMSTransport";
connectors = new HashMap();
passwords = new HashMap();
this.connectorProps = connectorProps;
this.connectionFactoryProps = connectionFactoryProps;
connectorLock = new Object();
}
public void setupMessageContextImpl(MessageContext context,
Call message,
AxisEngine engine)
throws AxisFault
{
String username = message.getUsername();
JMSConnector connector = null;
try
{
if (username == null)
{
initConnectorIfNecessary();
connector = defaultConnector;
}
else
{
String password = message.getPassword();
synchronized (connectorLock)
{
if (connectors.containsKey(username))
{
String oldPassword = (String)passwords.get(username);
if (password.equals(oldPassword))
connector = (JMSConnector)connectors.get(username);
else
throw new AxisFault("badUserPass");
}
else
{
connector = createConnector(username, password);
connectors.put(username, connector);
passwords.put(username, password);
}
}
}
}
catch (Exception e)
{
log.error(Messages.getMessage("cannotConnectError"), e);
if (e instanceof AxisFault)
throw (AxisFault)e;
throw new AxisFault("cannotConnect", e);
}
context.setProperty(JMSConstants.CONNECTOR, connector);
Object tmp = message.getProperty(JMSConstants.DESTINATION);
if (tmp != null && (tmp instanceof String || tmp instanceof Destination))
context.setProperty(JMSConstants.DESTINATION, tmp);
else
context.removeProperty(JMSConstants.DESTINATION);
tmp = message.getProperty(JMSConstants.WAIT_FOR_RESPONSE);
if (tmp != null && tmp instanceof Boolean)
context.setProperty(JMSConstants.WAIT_FOR_RESPONSE, tmp);
else
context.removeProperty(JMSConstants.WAIT_FOR_RESPONSE);
tmp = message.getProperty(JMSConstants.DELIVERY_MODE);
if (tmp != null && tmp instanceof Integer)
context.setProperty(JMSConstants.DELIVERY_MODE, tmp);
else
context.removeProperty(JMSConstants.DELIVERY_MODE);
tmp = message.getProperty(JMSConstants.PRIORITY);
if (tmp != null && tmp instanceof Integer)
context.setProperty(JMSConstants.PRIORITY, tmp);
else
context.removeProperty(JMSConstants.PRIORITY);
tmp = message.getProperty(JMSConstants.TIME_TO_LIVE);
if (tmp != null && tmp instanceof Long)
context.setProperty(JMSConstants.TIME_TO_LIVE, tmp);
else
context.removeProperty(JMSConstants.TIME_TO_LIVE);
}
private void initConnectorIfNecessary()
throws Exception
{
if (defaultConnector != null)
return;
synchronized (connectorLock)
{
if (defaultConnector != null)
return;
defaultConnector = createConnector(null, null);
}
}
private JMSConnector createConnector(String username, String password)
throws Exception
{
JMSConnector connector = JMSConnectorFactory.
createClientConnector(connectorProps, connectionFactoryProps,
username, password);
connector.start();
return connector;
}
public void shutdown()
{
synchronized (connectorLock)
{
if (defaultConnector != null)
defaultConnector.shutdown();
Iterator connectorIter = connectors.values().iterator();
while (connectorIter.hasNext())
{
((JMSConnector)connectorIter.next()).shutdown();
}
}
}
}