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.ember;
19
20 import org.apache.commons.logging.Log;
21 import org.apache.commons.logging.LogFactory;
22 import org.codehaus.activemq.message.WireFormat;
23 import org.codehaus.activemq.transport.TransportChannel;
24 import org.codehaus.activemq.transport.TransportChannelFactory;
25 import org.codehaus.activemq.util.IdGenerator;
26 import pyrasun.eio.EIOGlobalContext;
27 import pyrasun.eio.EIOPoolingStrategy;
28 import pyrasun.eio.services.EmberServiceController;
29 import pyrasun.eio.services.EmberServiceException;
30 import pyrasun.eio.services.bytearray.ByteArrayClientService;
31 import pyrasun.eio.services.bytearray.ByteArrayServerClient;
32
33 import javax.jms.JMSException;
34 import java.io.IOException;
35 import java.net.URI;
36
37 /***
38 * An EmberIO (using NIO) implementation of a TransportChannelFactory
39 *
40 * @version $Revision: 1.8 $
41 */
42 public class EmberTransportChannelFactory extends EmberSupport implements TransportChannelFactory {
43
44 protected static final Log log = LogFactory.getLog(EmberTransportChannelFactory.class);
45
46 private IdGenerator idGenerator = new IdGenerator();
47
48 public EmberTransportChannelFactory() {
49 }
50
51 public EmberTransportChannelFactory(EIOGlobalContext context, EIOPoolingStrategy ioPoolingStrategy) {
52 super(context, ioPoolingStrategy);
53 }
54
55 /***
56 * Create a Channel to a remote Node - e.g. a Broker
57 *
58 * @param wireFormat
59 * @param remoteLocation
60 * @return the TransportChannel bound to the remote node
61 * @throws JMSException
62 */
63 public TransportChannel create(WireFormat wireFormat, URI remoteLocation) throws JMSException {
64 try {
65 String id = idGenerator.generateId();
66 EmberServiceController controller = getController();
67
68 ByteArrayServerClient client = createClient(controller, remoteLocation, id);
69 return new EmberTransportChannel(wireFormat, getContext(), controller, client);
70 }
71 catch (IOException ioe) {
72 JMSException jmsEx = new JMSException("Initialization of TransportChannel failed: " + ioe);
73 jmsEx.setLinkedException(ioe);
74 throw jmsEx;
75 }
76 catch (EmberServiceException e) {
77 JMSException jmsEx = new JMSException("Initialization of TransportChannel failed: " + e);
78 jmsEx.setLinkedException(e);
79 throw jmsEx;
80 }
81 }
82
83 /***
84 * Create a Channel to a remote Node - e.g. a Broker
85 *
86 * @param wireFormat
87 * @param remoteLocation
88 * @param localLocation -
89 * e.g. local InetAddress and local port
90 * @return the TransportChannel bound to the remote node
91 * @throws JMSException
92 */
93 public TransportChannel create(WireFormat wireFormat, URI remoteLocation, URI localLocation) throws JMSException {
94 return create(wireFormat, remoteLocation);
95 }
96
97 public boolean requiresEmbeddedBroker() {
98 return false;
99 }
100
101 /***
102 * @param remoteLocation
103 * @param id
104 * @return @throws
105 * JMSException
106 * @throws EmberServiceException
107 * @throws IOException
108 */
109 protected ByteArrayServerClient createClient(EmberServiceController controller, URI remoteLocation, String id) throws JMSException,
110 EmberServiceException, IOException {
111 ByteArrayClientService service = createNioService(controller);
112 ByteArrayServerClient client = service.createClient(remoteLocation.getHost(), remoteLocation.getPort(), id, null);
113 return client;
114 }
115
116 /***
117 * Factory method to create a new ObjectClientService
118 *
119 * @throws JMSException if it could not be created
120 */
121 protected ByteArrayClientService createNioService(EmberServiceController controller) throws JMSException {
122 ByteArrayClientService service;
123 try {
124 service = new ByteArrayClientService(getContext(), getIoPoolingStrategy());
125 controller.addService(service);
126 }
127 catch (IOException e) {
128 throw createJMSException("Creation of NIO service failed: ", e);
129 }
130 return service;
131 }
132
133 }