/* * Copyright 2003,2004 Colin Crist * * 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 hermes.ext.wme; import hermes.impl.jms.ContextImpl; import java.util.HashSet; import java.util.Hashtable; import java.util.Set; import java.util.StringTokenizer; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.spi.InitialContextFactory; import org.apache.log4j.Logger; import COM.activesw.api.client.BrokerAdminClient; import COM.activesw.api.client.BrokerClientInfo; import COM.activesw.api.client.BrokerConnectionDescriptor; import com.wm.broker.jms.AdminFactory; import com.wm.broker.jms.QueueAdmin; import com.wm.broker.jms.QueueConnectionFactoryAdmin; /** * Factory to interrogate a broker and return a context containing all the client queues as JMS queues along with * a QueueConnectionFactory for each client group. * * @author colincrist@hermesjms.com last changed by: $Author: colincrist $ * @version $Id: WMEInitialContextFactory.java,v 1.2 2004/09/30 21:20:12 colincrist Exp $ */ public class WMEInitialContextFactory implements InitialContextFactory { private static final Logger log = Logger.getLogger(WMEInitialContextFactory.class); private static final String URN = "wme"; private static final Set ignoreClientGroups = new HashSet(); static { ignoreClientGroups.add("admin"); } /** * */ public WMEInitialContextFactory() { super(); } /* (non-Javadoc) * @see javax.naming.spi.InitialContextFactory#getInitialContext(java.util.Hashtable) */ public Context getInitialContext(Hashtable environment) throws NamingException { if (!environment.containsKey(Context.PROVIDER_URL)) { throw new NamingException(Context.PROVIDER_URL + " is not available"); } String providerURL = (String) environment.get(Context.PROVIDER_URL); if (!providerURL.startsWith(URN)) { throw new NamingException("providerURL URN is not " + URN); } /* * Parse the URL is a noddy way. */ String hostName = null; String brokerName = null; String port = null; providerURL = providerURL.substring(providerURL.indexOf('/')); for (StringTokenizer tokens = new StringTokenizer(providerURL, ":/@"); tokens.hasMoreTokens();) { String element = tokens.nextToken(); if (element != null && !element.equals("")) { if (brokerName == null) { brokerName = element; } else if (hostName == null) { hostName = element; } else if (port == null) { port = element; } } } if (hostName == null || brokerName == null || port == null) { throw new NamingException("providerURL (" + providerURL + ") is malformed, format is wme://brokerName@hostname:port"); } try { BrokerConnectionDescriptor bcd = new BrokerConnectionDescriptor(); bcd.setConnectionShare(true); try { bcd.setConnectionShareLimit(100); // some arbitary number to handle concurrent connection. } catch (NoSuchMethodError ex) { // Old version of WebMethods } bcd.setSharedEventOrdering(BrokerConnectionDescriptor.SHARED_ORDER_NONE); BrokerAdminClient adminClient = BrokerAdminClient.newOrReconnectAdmin(hostName + ":" + port, brokerName, "admin" + System.currentTimeMillis(), "admin", WMEInitialContextFactory.class.getName(), bcd); Context ctx = new ContextImpl(environment); /* * Lookup all the queues. */ final String[] clientIds = adminClient.getClientIds(); for (int i = 0; i < clientIds.length; i++) { final BrokerClientInfo info = adminClient.getClientInfoById(clientIds[i]); if (!ignoreClientGroups.contains(info.client_group)) { final QueueAdmin queue = AdminFactory.newQueue(); queue.setName(info.client_id); queue.setClientGroup(info.client_group); ctx.bind(info.client_id, queue); } } /* * Create a connection factory for each client group where there is a queue. */ final String[] clientGroups = adminClient.getClientGroupNames() ; for (int i = 0 ; i < clientGroups.length ; i++) { final String clientGroup = (String) clientGroups[i] ; final QueueConnectionFactoryAdmin cfAdmin = AdminFactory.newQueueConnectionFactory(); cfAdmin.setBrokerHost(hostName + ":" + port); cfAdmin.setBrokerName(brokerName); cfAdmin.setConnectionClientGroup(clientGroup); cfAdmin.setConnectionClientId("hermes-" + System.currentTimeMillis()); ctx.bind(clientGroup, cfAdmin); } adminClient.destroy(); return ctx; } catch (Exception e) { NamingException ex = new NamingException(e.getMessage()); ex.setRootCause(e); throw ex; } } }