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 EDU.oswego.cs.dl.util.concurrent.SynchronizedBoolean;
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23 import org.codehaus.activemq.message.WireFormat;
24 import org.codehaus.activemq.transport.TransportServerChannelSupport;
25 import pyrasun.eio.EIOGlobalContext;
26 import pyrasun.eio.services.EmberServiceController;
27 import pyrasun.eio.services.EmberServiceException;
28 import pyrasun.eio.services.bytearray.ByteArrayServerClient;
29 import pyrasun.eio.services.bytearray.ByteArrayServerClientListener;
30 import pyrasun.eio.services.bytearray.ByteArrayServerListener;
31
32 import javax.jms.JMSException;
33 import java.net.URI;
34
35 /***
36 * An EmberIO (using NIO) implementation of TransportServerChannel
37 *
38 * @version $Revision: 1.12 $
39 */
40 public class EmberTransportServerChannel extends TransportServerChannelSupport implements ByteArrayServerListener, ByteArrayServerClientListener {
41
42 private static final Log log = LogFactory.getLog(EmberTransportServerChannel.class);
43
44 private WireFormat wireFormat;
45 private EIOGlobalContext context;
46 private EmberServiceController controller;
47 protected URI bindAddress;
48 private SynchronizedBoolean closed;
49 private SynchronizedBoolean started;
50
51 public EmberTransportServerChannel(WireFormat wireFormat, URI bindAddr, EIOGlobalContext context, EmberServiceController controller) {
52 this.wireFormat = wireFormat;
53 this.bindAddress = bindAddr;
54 this.context = context;
55 this.controller = controller;
56 closed = new SynchronizedBoolean(false);
57 started = new SynchronizedBoolean(false);
58 log.info("ServerChannel at: " + bindAddress);
59 }
60
61 /***
62 * close the ServerChannel
63 */
64 public void stop() {
65 if (closed.commit(false, true)) {
66 try {
67 controller.stopAll();
68 context.stop();
69 }
70 catch (EmberServiceException e) {
71 log.error("Caught while closing: " + e, e);
72 }
73 }
74 }
75
76 /***
77 * start listeneing for events
78 *
79 * @throws JMSException if an error occurs
80 */
81 public void start() throws JMSException {
82 super.start();
83 if (started.commit(false, true)) {
84 super.stop();
85 try {
86 context.start();
87 controller.startAll();
88 }
89 catch (EmberServiceException e) {
90 JMSException jmsEx = new JMSException("Could not start EmberIOController: " + e);
91 jmsEx.setLinkedException(e);
92 throw jmsEx;
93 }
94 }
95 }
96
97 /***
98 * @return pretty print of this
99 */
100 public String toString() {
101 return "EmberTransportServerChannel@" + bindAddress;
102 }
103
104 protected void handleException(ByteArrayServerClient client, JMSException e) {
105 log.error("Could not create new TransportChannel for client: " + client, e);
106 }
107
108 public void newClient(ByteArrayServerClient client) {
109 log.trace("New client received!");
110
111 addClient(new EmberTransportChannel(wireFormat, null, null, client));
112 }
113
114 public void clientClosed(ByteArrayServerClient client) {
115 log.info("Client has disconnected: " + client);
116 /*** TODO implement client closing! */
117
118 }
119
120 public void newMessage(ByteArrayServerClient byteArrayServerClient, Object msg) {
121 log.warn("New message received!: " + msg);
122 }
123
124 }