//tale classe(thread) ha il compito di accettare richieste da parte di Master e di inoltrarle se possibile


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



public class SlaveAcceptMaster extends Thread{
	private int querySlavePort;
	
	
	public static void main(String[] args){
		//SlaveAcceptMaster sam = new SlaveAcceptMaster(10000);
		//sam.start();		
	}
	
	
	public SlaveAcceptMaster(int bp){
		querySlavePort=bp;
	}
	
	public void run(){
		byte[] data;
		byte[] buffer = new byte[65507];
		DatagramPacket  output;
		DatagramSocket ds=null;

		try{
			Constants.prn("Accept-provo a connettermi su porta: " + querySlavePort);
			ds = new DatagramSocket(querySlavePort);
			Constants.prn("Accept synchro-ricevo datagram x richieste");
		}
		catch (Exception e){
			System.out.println("errore crezione socket per richieste: "+e);
			return;
		}
		
		int i=0;
		while (true){
			try{
					

					DatagramPacket input = new 	DatagramPacket(buffer, buffer.length);
					ds.receive(input);
					synchronized(this){ 

						Constants.prn("Accept-Ho ricevuto richiesta da master: " + new String(input.getData(), 0, input.getLength()));
						if (ConstantsS.numRichiesteMaster < Constants.maxRichiesteMaster){
							ConstantsS.numRichiesteMaster++;
							data = "ack".getBytes();
							output = new DatagramPacket(data, data.length, input.getAddress(), input.getPort());
							ds.send(output);
							String rich = new String(input.getData(), 0, input.getLength());
							if (!ConstantsS.ackArrivato.contains(rich)){
								ConstantsS.ackArrivato.addElement(rich);
								Constants.prn("Accept-faccio partire lo slaveexemaster con: " + rich + "-" + querySlavePort);
								SlaveExeMaster sem = new SlaveExeMaster(querySlavePort, input);
								ConstantsS.slaveLoad++;
								sem.start();
							}
						}
						else{
							data = "sono pieno".getBytes();
							output = new DatagramPacket(data, data.length, input.getAddress(), input.getPort());
							ds.send(output);
						}
					}
			}//try
			catch (Exception e){
				System.out.println("Accept-errore uso socket per richieste: " + e);
				return;
			}//catch
		}//while
	}//run
}//class