1 package org.lsst.ccs.bus;
2
3 import org.lsst.ccs.bootstrap.resources.BootstrapResourceUtils;
4 import org.lsst.ccs.utilities.logging.Logger;
5 import org.lsst.ccs.utilities.tracers.Tracer;
6
7 import java.io.IOException;
8 import java.util.HashMap;
9 import java.util.List;
10 import java.util.Map;
11
12 public class BusMessagingFactory extends MessagingFactory{
13 static {
14 assert Tracer.version("$Rev$", BusMessagingFactory.class, "org-lsst-ccs-messaging-layer") ;
15 }
16
17 private BusMessagingLayer busMessagingLayer ;
18 private final Map<String,InnerFactory> map = new HashMap<>() ;
19 private final Logger curLogger = Logger.getLogger("org.lsst.ccs.bus") ;
20
21 private class InnerFactory extends MessagingFactory {
22 private final String subSystem ;
23 private final BusApplicationLayer layer ;
24 private final boolean[] registered = new boolean[Bus.values().length];
25 private boolean autoReply = true ;
26
27 InnerFactory(String subSystem, BusMessagingLayer transport) {
28 this.subSystem = subSystem;
29 this.layer = new BusApplicationLayer(subSystem, transport);
30 }
31
32 @Override
33 public synchronized void addCommandListener(CommandListener l) {
34 if(! registered[Bus.COMMAND.ordinal()]){
35 try {
36 layer.registerToCommand();
37 } catch (IOException e) {
38
39 throw new RuntimeException(e) ;
40 }
41 registered[Bus.COMMAND.ordinal()] = true ;
42 }
43 layer.addCommandListener(l);
44 }
45
46 @Override
47 public synchronized void removeCommandListener(CommandListener l) {
48 layer.removeCommandListener(l);
49 }
50
51 @Override
52 public synchronized void addStatusListener(StatusListens l) {
53 if(! registered[Bus.STATUS.ordinal()]){
54 try {
55 layer.registerToStatus();
56 } catch (IOException e) {
57 throw new RuntimeException(e) ;
58 }
59 registered[Bus.STATUS.ordinal()] = true ;
60 }
61 layer.addStatusListener(l);
62 }
63 @Override
64 public synchronized void removeStatusListener(StatusListens l) {
65 layer.removeStatusListener(l);
66 }
67
68 @Override
69 public synchronized void addLogListener(LogListener l) {
70 if(! registered[Bus.LOG.ordinal()]){
71 try {
72 layer.registerToLog();
73 } catch (IOException e) {
74 throw new RuntimeException(e) ;
75 }
76 registered[Bus.LOG.ordinal()] = true ;
77 }
78 layer.addLogListener(l);
79 }
80 @Override
81 public synchronized void removeLogListener(LogListener l) {
82 layer.removeLogListener(l);
83 }
84
85 @Override
86 public void addCommandListener(CommandListener l, String selector) {
87 addCommandListener(l);
88 }
89
90 @Override
91 public void addStatusListener(StatusListens l, String selector) {
92 addStatusListener(l);
93 }
94
95 @Override
96 public void addLogListener(LogListener l, String selector) {
97 addLogListener(l);
98 }
99
100 @Override
101 public synchronized void sendCommand(Command cmd) {
102 try {
103 if(! registered[Bus.COMMAND.ordinal()]){
104 layer.registerToCommand();
105 registered[Bus.COMMAND.ordinal()] = true ;
106 }
107
108 layer.sendCommand(cmd);
109 } catch (IOException e) {
110
111 if(e instanceof DestinationsException) {
112
113 curLogger.warn("destination problem", e) ;
114
115
116
117
118 throw new RuntimeException(e);
119 } else {
120 throw new RuntimeException(e);
121 }
122 }
123 }
124
125 @Override
126 public synchronized void sendStatus(Status status) {
127 try {
128 if(! registered[Bus.STATUS.ordinal()]){
129 layer.registerToStatus();
130 registered[Bus.STATUS.ordinal()] = true ;
131 }
132 layer.sendStatus(status);
133 } catch (IOException e) {
134
135 throw new RuntimeException(e);
136 }
137
138 }
139
140 @Override
141 public synchronized void sendLogEvent(LogEvent evt) {
142 try {
143 if(! registered[Bus.LOG.ordinal()]){
144 layer.registerToLog();
145 registered[Bus.LOG.ordinal()] = true ;
146 }
147 layer.sendLogEvent(evt);
148 } catch (IOException e) {
149
150 throw new RuntimeException(e);
151 }
152 }
153
154 @Override
155 public String getToken() {
156 return layer.getToken();
157 }
158
159 @Override
160 public void reply(CommandAckOrReply cmd) {
161 try {
162 layer.reply(cmd);
163 } catch (IOException e) {
164
165 throw new RuntimeException(e);
166 }
167 }
168
169 @Override
170 public void noAutoReply() {
171 autoReply = false ;
172 }
173
174
175 @Override
176 public boolean isReplyRequested(){
177 return this.autoReply ;
178 }
179
180 @Override
181 public void shutdownBusAccess() {
182 layer.close() ;
183 for(int ix = 0 ; ix < registered.length; ix++) {
184 registered[ix] = false ;
185 }
186
187 }
188 @Override
189 public List<String> connectedToCommand() {
190 return layer.connectedToCommand() ;
191 }
192
193 @Override
194 public synchronized void addMembershipListener(BusMembershipListener l) {
195 layer.addMembershipListener(l);
196 }
197
198 @Override
199 public synchronized void removeMembershipListener(BusMembershipListener l) {
200 layer.removeMembershipListener(l);
201 }
202 }
203
204
205
206 public BusMessagingFactory() {
207 String protocolProperty = BootstrapResourceUtils.getBootstrapSystemProperties().getProperty("org.lsst.ccs.transport", "jgroups:udp_ccs:") ;
208 String transportPropsProperty = BootstrapResourceUtils.getBootstrapSystemProperties().getProperty("org.lsst.ccs.transport.properties", "");
209 try {
210
211 busMessagingLayer = TransportManager.getConnection(protocolProperty,transportPropsProperty) ;
212 } catch (TransportException exc) {
213
214 throw new RuntimeException(exc) ;
215 }
216 }
217
218 @Override
219 public synchronized MessagingFactory forSubsystem(String name) {
220 InnerFactory fact = map.get(name) ;
221 if(fact == null ) {
222 fact = new InnerFactory(name, busMessagingLayer);
223 map.put(name, fact) ;
224 }
225 return fact ;
226 }
227
228
229 @Override
230 public void addCommandListener(CommandListener l) {
231 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
232 }
233 @Override
234 public synchronized void removeCommandListener(CommandListener l) {
235 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
236 }
237
238 @Override
239 public void addStatusListener(StatusListens l) {
240 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
241 }
242 @Override
243 public synchronized void removeStatusListener(StatusListens l) {
244 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
245 }
246
247 @Override
248 public void addLogListener(LogListener l) {
249 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
250 }
251
252 @Override
253 public synchronized void removeLogListener(LogListener l) {
254 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
255 }
256
257 @Override
258 public void addCommandListener(CommandListener l, String selector) {
259 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
260 }
261
262 @Override
263 public void addStatusListener(StatusListens l, String selector) {
264 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)");
265 }
266
267 @Override
268 public void addLogListener(LogListener l, String selector) {
269 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)");
270 }
271
272 @Override
273 public void sendCommand(Command cmd) {
274 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
275 }
276
277 @Override
278 public void sendStatus(Status status) {
279 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
280 }
281
282 @Override
283 public void sendLogEvent(LogEvent evt) {
284 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
285 }
286
287 @Override
288 public String getToken() {
289 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
290
291 }
292
293 @Override
294 public void reply(CommandAckOrReply cmd) {
295 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
296 }
297
298 @Override
299 public void noAutoReply() {
300 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
301 }
302
303 @Override
304 public void addMembershipListener(BusMembershipListener l) {
305 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
306 }
307
308 @Override
309 public void removeMembershipListener(BusMembershipListener l) {
310 throw new UnsupportedOperationException("incorrect call on factory: use forSubsystem(name)") ;
311 }
312 }