package net.kcc.oss.ctx;

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

// Import log4j classes.
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;

class CmdController extends Thread {

    Socket worksock;
    OutputStream outs;
    OutputStreamWriter outw;
    InputStream inss;
    InputStreamReader inpsr;
    BufferedReader ibrd;
    LineNumberReader lnr;
    boolean running;
    String cmdLine;
    CmdListener myListener;

    static Logger logger = Logger.getLogger(CmdController.class);

    public CmdController(CmdListener lst, Socket sock) {
	myListener = lst;
	worksock = sock;
    }

    public void run() {
	try {
      	    outs = worksock.getOutputStream();
      	    inss = worksock.getInputStream();
      	    inpsr = new InputStreamReader(inss);
      	    ibrd = new BufferedReader(inpsr);
	    lnr = new LineNumberReader(ibrd);
      	    outw = new OutputStreamWriter(outs);
      	    logger.debug("Local "+worksock.getLocalAddress()+
      			       " port "+worksock.getLocalPort()+
      			       " connected to "+worksock.getInetAddress()+
      			       " port "+worksock.getPort());
      	    //
      	    // prompt user
      	    //       
    	    outw.write("Hello to CmdController running at "+
      			"Local "+worksock.getLocalAddress()+
      			" port "+worksock.getLocalPort()+
      			" connected to "+worksock.getInetAddress()+
      			" port "+worksock.getPort());
    	    outw.write('\r');
    	    outw.write('\n');
    	    outw.flush();
	    running = true;
	    while (running) {
		cmdLine = lnr.readLine().toUpperCase();
		outw.write("200 you entered: "+cmdLine);
    	    	outw.write('\r');
    	    	outw.write('\n');
    	    	outw.flush();
		if (cmdLine.startsWith("QUIT")) { running = false; }
	    }
            //
            // cleanup and close shop
	    //
    	    outw.write("299 CmdController terminating");
    	    outw.write('\r');
    	    outw.write('\n');
    	    outw.flush();
    	    worksock.close();
    	    outw = null;
    	    outs = null;
    	    inss = null;
    	    ibrd = null;
	}
	catch (Exception e) { 
          logger.error("Exception: "+e);
	}

    }

}

class CmdListener extends Thread{

    private ServerSocket lstSocket;
    private String servName;
    private Properties servAttributes;
    public static final String C_DEF_SERVPORT = "8765";

    static Logger logger = Logger.getLogger(CmdListener.class);

    public String getAttribute(String anam, String adef) {
	return servAttributes.getProperty(anam,adef);
    }

    public String getAttribute(String anam) {
	return getAttribute(anam,"");
    }

    public CmdListener(String srvnam) {

	int srvport;
	String portNum;
	
	servName = srvnam;
	servAttributes = new Properties();
	try {
	    servAttributes.load(new FileInputStream("./"+servName+".DAT"));
	}
	catch (Exception e)  { logger.error("Exception reading Attributes: "+e); }

	String ports = servAttributes.getProperty("TCPICL_PORTS",
						  C_DEF_SERVPORT);
	portNum = ports; // accept only one port for starters
	srvport = Integer.parseInt(portNum);
	try {
	    lstSocket = new ServerSocket(srvport);
	}
	catch (Exception e) { 
          logger.error("Could not open CmdListener Socket: "+e);
	}

    }

    public void run() {
	CmdController cmdctl;
	Socket wsock;
        try {
	    logger.debug("listening at "+lstSocket.getLocalPort());
            while (true) {
	      wsock = lstSocket.accept();
	      logger.debug("Accepted connection");
	      cmdctl = new CmdController(this,wsock);
	      cmdctl.start();
	    }
	    
	}
	catch (Exception e) { 
	    logger.error("Exception in CmdListener run(): "+e);
	}
    }

}

class CmdSrv extends Thread {

    static CmdSrv theSrv;
    static Logger logger = Logger.getLogger(CmdSrv.class);
 
    public CmdSrv(String[] avec) {

	int namidx=0;
	CmdListener lst;

     	// Set up a simple configuration that logs on the console.
     	BasicConfigurator.configure();

	try {
	    while (namidx<avec.length) {
		lst = new CmdListener(avec[namidx++]);
		lst.start();
	    }
	}
	catch (Exception e) { logger.error("Error in CmdSrv: "+e); }
    }

    public static void main(String[] args) {

	theSrv = new CmdSrv(args);
       	while (true) { 
        try {
	    sleep(1000);
	}
	catch (Exception e) { logger.error("Error while sleeping: "+e); }
	}
    }
}

