package oracle.forms.fd;

import java.io.*;
import java.net.*;

/*
 * a class to manage a socket server
 */
public class Server extends Thread
{
  private static final int WAIT_FOR_CLIENT = 0 ;
  private static final int WAIT_FOR_ANSWER = 1 ;
  private ServerSocket sock;
  private int state = WAIT_FOR_CLIENT;
  
  public Server( int iPortNumber )
  {
    super("SocketServer") ;
    try
    {
      sock = new ServerSocket(iPortNumber);
      System.out.println("ServerSocket is running");
    } catch (IOException ioe) 
    {
      System.err.println("Error : unable to create socket");
    }
  }
  
  public void run()
  {
    Socket client = null ;
    while (true)
    {
      if (sock == null)
         return ;
      try 
      {
        client = sock.accept();
      } catch (IOException ioe) 
      {
        System.err.println("Error : unbale to connect the client");
        return ;
      }
      try
      {
        InputStreamReader isr = new InputStreamReader(client.getInputStream()) ;
        BufferedReader is = new BufferedReader(isr);
        PrintWriter os = new PrintWriter(new BufferedOutputStream(client.getOutputStream()),false);
        String outLine;
        
        outLine = getClientString(null);
        os.println(outLine);
        os.flush();
        
        while(true)
        {
         try{
            String inLine = is.readLine();
            if (inLine.length() > 0)
            {
               outLine = getClientString(inLine);
               System.out.println("outLine="+outLine);
               SocketServer.sMessage = outLine ;
               SocketServer.bMsg = true ;
            }
            else
               outLine = getClientString("");
            os.println(outLine);
            os.flush();
            if( outLine.equals("Bye."))
              break ;
          }
          catch(Exception ex)
          {
            break ;
          }             
          try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {;}                
        }
        os.close();
        is.close();
      } catch (Exception e) 
      {
        System.err.println("Error : "+e);
        e.printStackTrace();
      }
    }
  }
  
  // get the input from the client  
  String getClientString( String s)
  {
    String outStr = null ;
    switch (state)
    {
       case WAIT_FOR_CLIENT:
          outStr = "Server is ready, waiting for input\r\n enter Bye. to quit" ;
          state = WAIT_FOR_ANSWER ;
          break;
       case WAIT_FOR_ANSWER:
          outStr = s ;
          break ;     
    }
    return outStr ;
  }
  
}
