/**
  * This will parse the info byte array and take the 1-30 bytes off and convert that to a string
  * and search the database for the user that owns this token.
  *
  * @param info the byte array of size 31 that contains the user token
  * @return the {@link User} that owns the token.
  */
 private User getUserForToken(byte[] info) {
   User user = null;
   String token = new String(info).substring(1);
   Vector<String[]> query =
       sql.runQuery(
           sql.getPreparedStatement(
               "select u.id,u.username,u.name,u.email,u.permission from user_connection c left join user u on u.id=c.user where c.token=?",
               token));
   if (query.size() > 0) {
     String[] userInfo = query.get(0);
     user = new User(userInfo[2], userInfo[3], userInfo[1], Integer.parseInt(userInfo[4]));
     user.setId(Integer.parseInt(userInfo[0]));
   }
   return user;
 }
 /**
  * Called whenever the program ETAMonitor attempts to make a connection to this instance of ETA.
  * This should always be under the local IP and the last 30bytes are extracted and checked against
  * the database and checked to see if this is a valid token.
  *
  * <p>A connection should be established any time a job gets started on a machine. The idea of
  * this is to provide a gateway to the job that is running in case the user wants to send data to
  * job and it tells ETA that the job started on which machine and when it finishes. It also gets
  * the exit code to check if the job finished properly.
  *
  * @param client The {@link Socket} that the {@link ServerSocket} created when this connection was
  *     established.
  * @param info The first 31 bytes that was sent to this socket
  */
 private void etaMonitorConnected(Socket client, byte[] info) {
   System.out.println("monitor connected with info--" + new String(info));
   User user = getUserForToken(info);
   if (user == null) {
     try {
       client.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
     return;
   }
   String jobNumber = "";
   char letter;
   try {
     System.out.println("reading job for user " + user.getName());
     while ((letter = (char) client.getInputStream().read()) != '\n' && letter > -1) {
       jobNumber += letter;
     }
     System.out.println("job #" + jobNumber);
   } catch (IOException e) {
     return;
   }
   final int job = Integer.parseInt(jobNumber);
   RMIConnection con =
       new RMIConnection(
           client,
           this,
           false,
           new ConnectionListener() {
             @Override
             public void connectionLost() {
               monitorServices.remove(job);
             }
           });
   monitorServices.put(job, (RemoteMonitorService) con.getService(RemoteMonitorService.class));
 }
 /**
  * Called whenever the program ETAStart attempts to make a connection to this instance of ETA.
  * This should always be under the local IP and the last 30bytes are extracted and checked against
  * the database and checked to see if this is a valid token.
  *
  * <p>This provides a 2 way communication gateway for talking back and forth in order for the file
  * io calls and other calls to be secured.
  *
  * <p>There can only ever be one connection per user so if there is already a connection deny the
  * current one and close the socket.
  *
  * @param client The {@link Socket} that the {@link ServerSocket} created when this connection was
  *     established.
  * @param info The first 31 bytes that was sent to this socket
  */
 private void etaStartConnected(Socket client, byte[] info) {
   if (Arrays.equals(info, empty)) {
     // it looks like this is a new user. get the next line and check the userName in the database.
     String userName = "";
     char letter;
     try {
       while ((letter = (char) client.getInputStream().read()) != '\n' && letter > -1) {
         userName += letter;
       }
       // see if this user is in the database yet
       Vector<String[]> query =
           sql.runQuery(
               sql.getPreparedStatement("select id from user where username=?", userName));
       int userId;
       if (query.size() > 0) {
         // cool this person isn't new. save the user id to the int userId
         userId = Integer.parseInt(query.get(0)[0]);
       } else {
         // drat this person isn't in the database. get their information and add them in
         sql.addUser(
             AuthenticationService.getService().getUserFullName(userName), userName, "", 0);
         userId = SqlManager.getInstance().getUserInfoFromUsername(userName).getId();
       }
       String newToken = CommunicationImpl.getInstance().generateToken();
       System.out.println(newToken + " for user " + userName);
       info = (" " + newToken).getBytes();
       sql.executeUpdate(
           sql.getPreparedStatement("delete from user_connection where user="******"insert into user_connection values(?," + userId + ")", newToken));
       client.getOutputStream().write(newToken.getBytes());
       client.getOutputStream().flush();
     } catch (IOException e) {
       e.printStackTrace();
       try {
         client.close();
       } catch (IOException e1) {
         e1.printStackTrace();
       }
       return;
     }
   }
   final User user = getUserForToken(info);
   if (user == null) {
     try {
       client.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
     return;
   }
   if (userServices.containsKey(user.getId())) {
     try {
       client.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
     return;
   }
   System.out.println("user " + user.getId() + " is connected");
   RMIConnection con =
       new RMIConnection(
           client,
           new RemoteETAConnectionServiceImpl(user.getId()),
           false,
           new ConnectionListener() {
             @Override
             public void connectionLost() {
               System.out.println("Connection lost :(");
               userServices.remove(user.getId());
               sql.executeUpdate(
                   sql.getPreparedStatement("delete from token where user=" + user.getId()));
             }
           });
   userServices.put(user.getId(), (RemoteUserService) con.getService(RemoteUserService.class));
 }