BowlerKernel
BowlerAbstractServer.java
Go to the documentation of this file.
1 package com.neuronrobotics.sdk.common.device.server;
2 
3 import java.io.IOException;
4 import java.net.InetAddress;
5 import java.net.ServerSocket;
6 import java.net.Socket;
7 import java.net.UnknownHostException;
8 import java.util.ArrayList;
9 
10 import javax.management.RuntimeErrorException;
11 
12 import com.neuronrobotics.sdk.common.BowlerAbstractCommand;
13 import com.neuronrobotics.sdk.common.BowlerAbstractConnection;
14 import com.neuronrobotics.sdk.common.BowlerAbstractDevice;
15 import com.neuronrobotics.sdk.common.BowlerDataType;
16 import com.neuronrobotics.sdk.common.BowlerDatagram;
17 import com.neuronrobotics.sdk.common.BowlerDatagramFactory;
18 import com.neuronrobotics.sdk.common.BowlerMethod;
19 import com.neuronrobotics.sdk.common.DeviceConnectionException;
20 import com.neuronrobotics.sdk.common.DeviceManager;
21 import com.neuronrobotics.sdk.common.IConnectionEventListener;
22 import com.neuronrobotics.sdk.common.ISynchronousDatagramListener;
23 import com.neuronrobotics.sdk.common.Log;
24 import com.neuronrobotics.sdk.common.MACAddress;
25 import com.neuronrobotics.sdk.common.NamespaceEncapsulation;
26 import com.neuronrobotics.sdk.common.RpcEncapsulation;
27 import com.neuronrobotics.sdk.common.device.server.bcs.core.BcsCoreNamespaceImp;
28 import com.neuronrobotics.sdk.common.device.server.bcs.rpc.BcsRpcNamespaceImp;
29 import com.neuronrobotics.sdk.network.BowlerTCPServer;
30 import com.neuronrobotics.sdk.network.BowlerUDPServer;
31 import com.neuronrobotics.sdk.network.UDPBowlerConnection;
32 
33 // TODO: Auto-generated Javadoc
37 public abstract class BowlerAbstractServer implements
39 
41  private ArrayList<BowlerAbstractConnection> servers = new ArrayList<BowlerAbstractConnection>();
42 
44  private ArrayList<BowlerAbstractConnection> localServers = new ArrayList<BowlerAbstractConnection>();
45 
47  private ArrayList<BowlerAbstractDeviceServerNamespace> namespaces = new ArrayList<BowlerAbstractDeviceServerNamespace>();
48 
51 
54 
57 
60 
67  this.setMacAddress(mac);
68  bcsCore = new BcsCoreNamespaceImp(this, mac);
69  bcsRpc = new BcsRpcNamespaceImp(this, mac);
70  setup();
71  }
72 
76  private void setup() {
77  if (!getNamespaces().contains(bcsCore)) {
78  getNamespaces().add(bcsCore);
80  }
81  if (!getNamespaces().contains(bcsRpc)) {
83  getNamespaces().add(bcsRpc);
84  }
85  }
86 
94  setup();
95  if (!getNamespaces().contains(ns)) {
96  for (int i = 0; i < getNamespaces().size(); i++) {
97  if (getNamespaces().get(i).getNamespace()
98  .contains(ns.getNamespace())) {
99  Log.error("Duplicate Namespace" + ns.getNamespace());
100  return;
101  }
102  }
103  ns.setNamespaceIndex(getNamespaces().size());
104  getNamespaces().add(ns);
105  }
106  }
107 
115  setup();
116  if (getNamespaces().contains(ns))
117  getNamespaces().remove(ns);
118  }
119 
127  setup();
128  if (getNamespaces().size() == 0) {
129  throw new RuntimeException("No namespaces defined");
130  }
132  // System.out.println("Checking "+n.getNamespaces().get(0));
133  if (n.checkRpc(data)) {
134  BowlerDatagram d = n.process(data);
135  if (d != null) {
136  if (!d.getRPC().contains("_err"))
137  return d;
138  }
139  }
140  }
141  Log.error("No namespace found for " + data);
142  return null;
143  }
144 
150  public ArrayList<BowlerAbstractConnection> getServers() {
151  return servers;
152  }
153 
155  ServerSocket serverSocket;
156 
163  public void startNetworkServer(final int port) throws IOException {
164  udpServer = new BowlerUDPServer(port);
165  serverSocket = new ServerSocket(port + 1);
166  new Thread() {
167  public void run() {
168  setName("Bowler Platform Network Server");
170  while (true) {
171  Socket s;
172  try {
173  //ex.printStackTrace();
174  Log.warning("\n\nWaiting for UDP connection on port "+(port)+"...");
175  Log.warning("\n\nWaiting for TCP connection on port "+(port+1)+"...");
176  s = serverSocket.accept();
177  addServer(new BowlerTCPServer(s));
178  Log.warning("Got a connection!");
179  } catch (IOException e) {
180  // TODO Auto-generated catch block
181  e.printStackTrace();
182  }
183  }
184  }
185  }.start();
186 
187  }
188 
194  public void startNetworkServer() throws IOException {
195  startNetworkServer(1865);
196 
197  }
198 
205  if (!servers.contains(srv)) {
207  @Override
208  public void onDisconnect(BowlerAbstractConnection source) {
209  Log.warning("Removing server from listener");
210  removeServer(source);
211  }
212 
213  @Override
214  public void onConnect(BowlerAbstractConnection source) {
215 
216  }
217  });
218  servers.add(srv);
219  srv.connect();
221  }
222  }
223 
224  /* (non-Javadoc)
225  * @see com.neuronrobotics.sdk.common.ISynchronousDatagramListener#onSyncReceive(com.neuronrobotics.sdk.common.BowlerDatagram)
226  */
227  @Override
229  if (data.isUpstream()) {
230  // a server ignores upstream packets received
231  Log.error("Upstream packet detected" + data);
232  return null;
233  }
234  if (!data.getRPC().contains("_png"))
235  Log.debug("Server Got >> " + data);
236  else {
237  Log.info("Got >> ping");
238  }
239  BowlerDatagram bd = processLocal(data);
240  if (bd != null) {
241  if (!data.getRPC().contains("_png"))
242  Log.debug("Server Response << " + bd);
243  else {
244  Log.info("Response << ping");
245  }
246  return bd;
247  } else {
248  Log.error("Packet unknown" + data);
249  }
250  return null;
251  }
252 
259  if (b == udpServer) {
260  try {
262  } catch (IOException e) {
263  // TODO Auto-generated catch block
264  e.printStackTrace();
265  }
266  return;
267  }
268  Log.error("Server Removed " + b);
269  // new RuntimeException().printStackTrace();
270 
271  getServers().remove(b);
272  }
273 
289  public void pushAsyncPacket(int namespaceIndex, String namespace,
290  String rpcString, Object[] arguments,
291  BowlerDataType[] asyncArguments) {
292  if (arguments.length != asyncArguments.length) {
293  throw new RuntimeException(
294  "Arguments must match argument types exactly, your two arrays are different lengths");
295  }
296  RpcEncapsulation rpcl = new RpcEncapsulation(namespaceIndex, namespace,
297  rpcString, BowlerMethod.ASYNCHRONOUS, asyncArguments, null,
298  null);
300  namespace, BowlerMethod.ASYNCHRONOUS, rpcString, arguments,
301  rpcl);
303  command);
304  Log.debug("Async>>" + cmd);
305  pushAsyncPacket(cmd);
306  }
307 
313  public synchronized void pushAsyncPacket(BowlerDatagram data) {
314  localServers.clear();
315  for (int i = 0; i < servers.size(); i++) {
316  localServers.add(getServers().get(i));
317  }
318 
319  for (int i = 0; i < servers.size(); i++) {
320  try {
321  boolean run = false;
322  if (localServers.get(i).getClass() == BowlerTCPServer.class) {
324  if (b.isClientConnected()) {
325  run = true;
326  Log.info("TCP Bowler client ...OK!");
327  }
328  } else {
329  run = true;
330  }
331  if (localServers.get(i).getClass() != BowlerUDPServer.class) {
332  // System.out.println("Sending packet to "+getServers().get(i).getClass());
333  if (run && localServers.get(i).isConnected()) {
334  // Log.warning("ASYNC<<\r\n"+data );
335  String classString = localServers.get(i).getClass()
336  .toString();
337  localServers.get(i).sendAsync(data);
338  Log.info("Sent packet to " + classString);
339  }
340  } else {
341  try {
342  localServers.get(i).sendAsync(data);
343  } catch (NullPointerException ex) {
344  }
345  }
346  } catch (IndexOutOfBoundsException ie) {
347  ie.printStackTrace();
348  } catch (Exception e) {
349  try {
350  e.printStackTrace();
352  Log.error("No client connected to this connection "
353  + abs.getClass());
354  abs.disconnect();
355 
356  } catch (Exception ex) {
357  ex.printStackTrace();
358  }
359  }
360  }
361  localServers.clear();
362  }
363 
369  public ArrayList<BowlerAbstractDeviceServerNamespace> getNamespaces() {
370  return namespaces;
371  }
372 
378  public void setNamespaces(
379  ArrayList<BowlerAbstractDeviceServerNamespace> namespaces) {
380  this.namespaces = namespaces;
381  }
382 
389  return macAddress;
390  }
391 
398  this.macAddress = macAddress;
399  }
400 
401 
402 
403 }
static BowlerAbstractCommand getCommand(String namespace, BowlerMethod method, String rpcString, Object[] arguments, RpcEncapsulation rpc)
void setSynchronousDatagramListener(ISynchronousDatagramListener l)
static void info(String message)
Definition: Log.java:110
static void error(String message)
Definition: Log.java:92
static void warning(String message)
Definition: Log.java:101
static void debug(String message)
Definition: Log.java:128
ArrayList< BowlerAbstractDeviceServerNamespace > namespaces
void removeBowlerDeviceServerNamespace(BowlerAbstractDeviceServerNamespace ns)
ArrayList< BowlerAbstractDeviceServerNamespace > getNamespaces()
void addBowlerDeviceServerNamespace(BowlerAbstractDeviceServerNamespace ns)
void pushAsyncPacket(int namespaceIndex, String namespace, String rpcString, Object[] arguments, BowlerDataType[] asyncArguments)
void setNamespaces(ArrayList< BowlerAbstractDeviceServerNamespace > namespaces)