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 }