/*
* Copyright 2001, 2002,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.axis.components.jms;
import java.util.HashMap;
import java.util.Hashtable;
import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.Topic;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.apache.axis.transport.jms.JMSConstants;
import org.apache.axis.transport.jms.JMSURLHelper;
/**
* Uses JNDI to locate ConnectionFactory and Destinations
*
* @author Jaime Meritt (jmeritt@sonicsoftware.com)
* @author Ray Chun (rchun@sonicsoftware.com)
*/
public class JNDIVendorAdapter extends JMSVendorAdapter
{
public final static String CONTEXT_FACTORY = "java.naming.factory.initial";
public final static String PROVIDER_URL = "java.naming.provider.url";
public final static String _CONNECTION_FACTORY_JNDI_NAME = "ConnectionFactoryJNDIName";
public final static String CONNECTION_FACTORY_JNDI_NAME = JMSConstants.JMS_PROPERTY_PREFIX +
_CONNECTION_FACTORY_JNDI_NAME;
private Context context;
public QueueConnectionFactory getQueueConnectionFactory(HashMap cfConfig)
throws Exception
{
return (QueueConnectionFactory)getConnectionFactory(cfConfig);
}
public TopicConnectionFactory getTopicConnectionFactory(HashMap cfConfig)
throws Exception
{
return (TopicConnectionFactory)getConnectionFactory(cfConfig);
}
private ConnectionFactory getConnectionFactory(HashMap cfProps)
throws Exception
{
if(cfProps == null)
throw new IllegalArgumentException("noCFProps");
String jndiName = (String)cfProps.get(CONNECTION_FACTORY_JNDI_NAME);
if(jndiName == null || jndiName.trim().length() == 0)
throw new IllegalArgumentException("noCFName");
Hashtable environment = new Hashtable(cfProps);
// set the context factory if provided in the JMS URL
String ctxFactory = (String)cfProps.get(CONTEXT_FACTORY);
if (ctxFactory != null)
environment.put(CONTEXT_FACTORY, ctxFactory);
// set the provider url if provided in the JMS URL
String providerURL = (String)cfProps.get(PROVIDER_URL);
if (providerURL != null)
environment.put(PROVIDER_URL, providerURL);
context = new InitialContext(environment);
return (ConnectionFactory)context.lookup(jndiName);
}
/**
* Populates the connection factory config table with properties from
* the JMS URL query string
*
* @param jmsurl The target endpoint address of the Axis call
* @param cfConfig The set of properties necessary to create/configure the connection factory
*/
public void addVendorConnectionFactoryProperties(JMSURLHelper jmsurl,
HashMap cfConfig)
{
// add the connection factory jndi name
String cfJNDIName = jmsurl.getPropertyValue(_CONNECTION_FACTORY_JNDI_NAME);
if (cfJNDIName != null)
cfConfig.put(CONNECTION_FACTORY_JNDI_NAME, cfJNDIName);
// add the initial ctx factory
String ctxFactory = jmsurl.getPropertyValue(CONTEXT_FACTORY);
if (ctxFactory != null)
cfConfig.put(CONTEXT_FACTORY, ctxFactory);
// add the provider url
String providerURL = jmsurl.getPropertyValue(PROVIDER_URL);
if (providerURL != null)
cfConfig.put(PROVIDER_URL, providerURL);
}
/**
* Check that the attributes of the candidate connection factory match the
* requested connection factory properties.
*
* @param cf the candidate connection factory
* @param originalJMSURL the URL which was used to create the connection factory
* @param cfProps the set of properties that should be used to determine the match
* @return true or false to indicate whether a match has been found
*/
public boolean isMatchingConnectionFactory(ConnectionFactory cf,
JMSURLHelper originalJMSURL,
HashMap cfProps)
{
JMSURLHelper jmsurl = (JMSURLHelper)cfProps.get(JMSConstants.JMS_URL);
// just check the connection factory jndi name
String cfJndiName = jmsurl.getPropertyValue(_CONNECTION_FACTORY_JNDI_NAME);
String originalCfJndiName = originalJMSURL.getPropertyValue(_CONNECTION_FACTORY_JNDI_NAME);
if (cfJndiName.equalsIgnoreCase(originalCfJndiName))
return true;
return false;
}
public Queue getQueue(QueueSession session, String name)
throws Exception
{
return (Queue)context.lookup(name);
}
public Topic getTopic(TopicSession session, String name)
throws Exception
{
return (Topic)context.lookup(name);
}
} |