View Javadoc

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                      //TODO: change that!
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                 //TODO: check if Command without Origin!
108                 layer.sendCommand(cmd);
109             } catch (IOException e) {
110                 //TODO:change that!!!
111               if(e instanceof DestinationsException) {
112                   //System.out.println(" Log WARN: " + e);
113                   curLogger.warn("destination problem", e) ;
114                   // toDO : wit until lock arbitrator
115                   // The exception is thrown again to address https://jira.slac.stanford.edu/browse/LSSTCCS-181
116                   // In the future we might want to have smarter logic to address any
117                   // LockArbitrator issues.
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                 //TODO:change that!!!
135                 throw new RuntimeException(e);
136             }
137             //To change body of implemented methods use File | Settings | File Templates.
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                 //TODO:change that!!!
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                 //TODO:change that!!!
165                 throw new RuntimeException(e);
166             }
167         }
168 
169         @Override
170         public void noAutoReply() {
171             autoReply = false ;
172         }
173 
174         // TODO: change that .....
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     ///////////////////////////////////////// CTOR
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         //busMessagingLayer = (BusMessagingLayer) Class.forName(clazzName).newInstance();
211             busMessagingLayer = TransportManager.getConnection(protocolProperty,transportPropsProperty) ;
212         } catch (TransportException exc) {
213             //todo: change this exception
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     ///////////////////////////////////////// METHODS
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         //return null;
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 }