1 /*** 2 * 3 * Copyright 2004 Protique Ltd 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 **/ 18 package org.codehaus.activemq.transport; 19 20 import org.codehaus.activemq.message.WireFormat; 21 import org.codehaus.activemq.util.FactoryFinder; 22 23 import javax.jms.JMSException; 24 import java.io.IOException; 25 import java.net.URI; 26 import java.net.URISyntaxException; 27 28 /*** 29 * locates a protocol specific TransportServerChannelFactory 30 * 31 * @version $Revision: 1.13 $ 32 */ 33 public class TransportServerChannelProvider { 34 35 private static FactoryFinder finder = new FactoryFinder("META-INF/services/org/codehaus/activemq/transport/server/"); 36 37 /*** 38 * Create a Channel used for the Broker to listen to remove connections 39 * 40 * @param bindAddress 41 * @return the TransportServerChannel bound to the address 42 * @throws JMSException 43 */ 44 public static TransportServerChannel create(WireFormat wireFormat, URI bindAddress) throws JMSException { 45 return getFactory(bindAddress.getScheme()).create(wireFormat, bindAddress); 46 } 47 48 /*** 49 * Create a Channel used for the Broker to listen to remove connections 50 * 51 * @param bindAddress 52 * @return the TransportServerChannel bound to the address 53 * @throws JMSException 54 */ 55 public static TransportServerChannel newInstance(WireFormat wireFormat, String bindAddress) throws JMSException, URISyntaxException { 56 return create(wireFormat, new URI(bindAddress)); 57 } 58 59 protected static TransportServerChannelFactory getFactory(String protocol) throws JMSException { 60 try { 61 Object value = finder.newInstance(protocol); 62 if (value instanceof TransportServerChannelFactory) { 63 return (TransportServerChannelFactory) value; 64 } 65 else { 66 throw new JMSException("Factory does not implement TransportServerChannelFactory: " + value); 67 } 68 } 69 catch (IllegalAccessException e) { 70 throw createJMSexception(protocol, e); 71 } 72 catch (InstantiationException e) { 73 throw createJMSexception(protocol, e); 74 } 75 catch (IOException e) { 76 throw createJMSexception(protocol, e); 77 } 78 catch (ClassNotFoundException e) { 79 throw createJMSexception(protocol, e); 80 } 81 82 } 83 84 protected static JMSException createJMSexception(String protocol, Exception e) { 85 JMSException answer = new JMSException("Could not load protocol: " + protocol + ". Reason: " + e); 86 answer.setLinkedException(e); 87 return answer; 88 } 89 }