//CYCLONE MATRIX HOST NODE APPLICATION
//Hermann L. Johnson, 2019
//Free for unmodified distribution and non-commercial use.

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.zip.*;

public class ServerConnectionThread extends Thread
{

   private ServerSocket serverSocket;

   private int PORT;
   private int MAX_CONNECTIONS;
   private Vector<ServerThread> openSockets;
   private DataManager data_manager;

   private boolean intakeServer, zipped;

   private boolean running;

   public ServerConnectionThread(int port, int max_connections,
                                 DataManager data_manager, boolean intake,
                                 boolean zipped)
   {

       super("ServerConnectionThread-Upload:"+Integer.valueOf(port));
       running = false;
       PORT = port;
       MAX_CONNECTIONS = max_connections;
       intakeServer = intake;
       this.data_manager = data_manager;
       this.zipped = zipped;
       openSockets = new Vector<ServerThread>();

   }

   public synchronized boolean running() {
       return running;
   }

   public synchronized void setRunning(boolean newValue) {
       running = newValue;
   }

   public void killThread() {

       setRunning(false);

   }

   public synchronized int getNumActiveConnections() {
       return openSockets.size();
   }

   private synchronized void checkSockets() {
       for(int count=0;count<openSockets.size();count++) {
           if(openSockets.elementAt(count).isClosed()) {
               openSockets.removeElementAt(count);
               count--;
           }
       }
   }

   public void run()
   {

       running = true;

       try {
           while(running) {

               if(openSockets.size()<MAX_CONNECTIONS) {

                   serverSocket = new ServerSocket(PORT,0);
                   synchronized(this) {
                   openSockets.addElement(new ServerThread(
                              serverSocket.accept(), data_manager,
                              intakeServer, zipped));
                   openSockets.elementAt(openSockets.size()-1).start();
                   }
                   serverSocket.close();

               }
               Thread.sleep(200);
               checkSockets();
//HEALTH REPORT?
           }
       } catch(Exception e) {
           System.err.println("Problem operating server socket: "+
                              String.valueOf(PORT));
       }
   }

}