package system.SDVServer;

import java.net.*;
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import SDVConstants;

/**
 * main class for the system day values server <br>
 * Creation date: (1/3/00 12:42:28 AM) <br>
 * @author: lex <br>
 *  <br>
 * Supported requests <br>
 *
 * ReqType=0 <br>
 * overview
 *
 * ReqType=1 <br>
 * Count rws for a market <br>
 * Command string <br>
 * SDVServer?ReqType=1&marketKey=1&numWord=2&rwKey1=353&rwCounts1=3&rwKey2=609&rwCounts2=1 <br>
 * returns: <br>
 * nothing <br>
 *
 * ReqType=2 <br>
 * returns html configuration page<br>
 * Command string <br>
 * SDVServer?ReqType=2&marketKey=1 <br>
 * returns: <br>
 * html <br>
 *
 * ReqType=3 <br>
 * change a servlet parameter<br>
 * Command string <br>
 * SDVServer?ReqType=3&marketKey=1&name=RSRServerLocation&value=http://www.server.esof/esofia/ResourceServer? <br>
 * returns: <br>
 * html <br>
 *
 * ReqType=4 <br>
 * saves servlet parameters to file<br>
 * Command string <br>
 * SDVServer?ReqType=4&marketKey=1 <br>
 * returns: <br>
 * html <br>
 *
 * ReqType=5 <br>
 * re - init the servlet<br>
 * Command string <br>
 * SDVServer?ReqType=5&marketKey=1 <br>
 * returns: <br>
 * html <br>
 *
 */
public class SDVServer extends javax.servlet.http.HttpServlet {
	private static String sdvDVTableName;
	private static String sdvMarketDVTableName;
	private static Connection sdvDBDVConn = null;
	private static Connection sdvDBMarketDVConn = null;
	private static LogPrinter LogOutput;
	private static int[] sdvActiveMarkets;
	private static ConfigSDVServer sdvConfig;
	private static Object sdvDBDVSync = new Object();
	private static Object sdvDBMarketDVSync = new Object();
	private static Object sdvRWSync = new Object();
	public final static String ver = "AAA007 | 000721";
	public static boolean ready = true;
/**
 * SDVServer constructor.
 */
public SDVServer() {
	super();
}
/**
 * the destroy method of the servlet <br>
 * closes the connection to the db using the sdvDBDisConn() method<br>
 * Creation date: (15.2.00 15:01:42) <br>
 */
public void destroy() {
	sdvDBDisConn();
}
/**
 * this is the init method of the servlet. <br>
 * estaablishe a db connection using sdvDBConn() method <br>
 * Creation date: (15.2.00 15:37:51) <br>
 */
public void init(ServletConfig config) throws ServletException {
	super.init(config); //This statement must always be here !!!
	sdvInit();
}
/**
 * Change a config param's value <br>
 * Creation date: (07.3.2000 a. 16:38:17) <br>
 * @param req HttpServletRequest  <br>
 */
public void sdvChangeParams(HttpServletRequest req) {
	String paramName = "";
	String paramValue = "";
	try {
		paramName = req.getParameter(SDVConstants.sName);
		paramValue = req.getParameter(SDVConstants.sValue);
	} catch (Exception E) {
		LogOutput.log("bad data type for config parameter name " + E, LogOutput.ERROR);
		LogOutput.flush();
		return;
	}
	sdvConfig.setParam(paramName, paramValue);
}
/**
 * return false if the connection is null or closed <br>
 * Creation date: (4.5.00 12:08:47) <br>
 * @return boolean <br>
 */
private boolean sdvCheckConnection() {
	try {
		if (!sdvDBDVConn.isClosed() && sdvDBDVConn != null && !sdvDBMarketDVConn.isClosed() && sdvDBMarketDVConn != null)
			return true;
		else
			return false;
	} catch (Exception E) {
		return false;
	}
}
/**
 * Check if the marketKey form the request is a valid one <br>
 * Creation date: (26.2.2000 a. 19:56:10) <br>
 * @return boolean <br>
 * @param marketKey int <br>
 */
private boolean sdvCheckForActiveMarket(int marketKey) {
	if (sdvActiveMarkets == null) return false;
	else
		for(int counter = 0; counter < sdvActiveMarkets.length ; counter++)
			if (sdvActiveMarkets[counter] == marketKey)
				return true;
	return false;
}
/**
 * check if the tables pointed by the sdvTableName field exist in the sdv database. <br>
 * Creation date: (1/8/00 12:53:49 AM) <br>
 * @return boolean <br>
 */
private boolean sdvCheckIfExist(String tableName, Connection DBConn) {
	String SQLStat = "show tables like \"" + tableName + "\"";
	boolean Res = false;
	boolean exit = true;
	int errorr_counter = 0;
	do {
		try {
			Statement Stmt = DBConn.createStatement();
			ResultSet RS = Stmt.executeQuery(SQLStat);
			if (RS.next())
				Res = true;
			else
				Res = false;
			RS.close();
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on checking if the day table exist on SQLQuery: " + SQLStat + " - sql exception: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !sdvServeConnection();
			Res = false;
			errorr_counter++;
		}
	} while (!exit && errorr_counter < 3);
	return Res;
}
/**
 * create a new table for today in the sDayValues db. <br>
 * Creation date: (1/8/00 11:21:56 PM) <br>
 */
private boolean sdvCreateTable(String tableName, Connection DBConn) {
	if (sdvCheckIfExist(tableName, DBConn))
		return true;
	boolean exit = true;
	String SQLStat = "";
	if (tableName == sdvDVTableName)
		SQLStat = "create table " + sdvDVTableName + SDVConstants.sDBDVTableCreateDef;
	if (tableName == sdvMarketDVTableName)
		SQLStat = "create table " + sdvMarketDVTableName + SDVConstants.sDBMarketDVTableCreateDef;
	if (SQLStat == "") {
		LogOutput.log("fail on creating the day table - bad param value for tableName", LogOutput.ERROR);
		LogOutput.flush();
		return false;
	}
	boolean result;
	synchronized (sdvRWSync) {
		if (sdvCheckIfExist(tableName, DBConn))
			return true;
		int errorr_counter = 0;
		do {
			try {
				Statement Stmt = DBConn.createStatement();
				Stmt.executeQuery(SQLStat);
				Stmt.close();
				exit = true;
				result = true;
			} catch (SQLException E) {
				LogOutput.log("fail on creating the day table - sql exception: " + E.getMessage(), LogOutput.ERROR);
				LogOutput.flush();
				exit = !sdvServeConnection();
				result = false;
				errorr_counter++;
			}
		} while (!exit && errorr_counter < 3);
	}
	return result;
}
/**
 * establish a connection with the db. <br>
 * Creation date: (1/8/00 1:02:57 AM) <br>
 * @param DBName java.lang.String <br>
 */
private boolean sdvDBConn() {
	// establish a connection and put a reference to it in the srcDBConn field
	int countOfTries = 3;
	try {
		if (sdvDBDVConn == null || sdvDBDVConn.isClosed()) {
			synchronized (sdvDBDVSync) {
				for (int counter = 0; counter < countOfTries && (sdvDBDVConn == null || sdvDBDVConn.isClosed()); counter++) {
					try {
						sdvDBDVConn = DriverManager.getConnection(sdvConfig.sDBRWDVLocation + sdvConfig.sDBNameRWDV, sdvConfig.sDBRWDVUser, sdvConfig.sDBRWDVPass);
					} catch (SQLException E) {
						LogOutput.log("fail on connecting to the dv db - sql exception: " + E.getMessage(), LogOutput.ERROR);
						LogOutput.flush();
					}
				}
			}
		}
		if (sdvDBMarketDVConn == null || sdvDBMarketDVConn.isClosed()) {
			synchronized (sdvDBMarketDVSync) {
				for (int counter = 0; counter < countOfTries && (sdvDBMarketDVConn == null || sdvDBMarketDVConn.isClosed()); counter++) {
					try {
						sdvDBMarketDVConn = DriverManager.getConnection(sdvConfig.sDBRWMarketDVLocation + sdvConfig.sDBNameRWMarketDV, sdvConfig.sDBRWMarketUser, sdvConfig.sDBRWMarketPass);
					} catch (SQLException E) {
						LogOutput.log("fail on connecting to the marketdv db - sql exception: " + E.getMessage(), LogOutput.ERROR);
						LogOutput.flush();
					}
				}
			}
		}
		LogOutput.log("db connected", LogOutput.INFO);
	} catch (SQLException E) {
		LogOutput.log("fail on connecting to the db - sql exception: " + E.getMessage(), LogOutput.ERROR);
		LogOutput.flush();
		return false;
	}
	return true;
}
/**
 * Closes the connection to the database <br>
 * Creation date: (1/8/00 1:03:13 AM) <br>
 */
private boolean sdvDBDisConn() {
	try {
		if (sdvDBDVConn != null)
			sdvDBDVConn.close();
		if (sdvDBMarketDVConn != null)
			sdvDBMarketDVConn.close();
	} catch (Exception E) {
		LogOutput.log("cannot close the db - sql exception: " + E.getMessage(), LogOutput.ERROR);
		LogOutput.flush();
		return false;
	}
	return true;
}
/**
 * Return Web page to browser. <br> This is the configuration page of SDVServer <br> 
 * Creation date: (07/03/00 09:21:27 AM) <br>
 * @param fileOut java.io.PrintWriter <br>
 */
public void sdvFormConfigParam(PrintWriter fileOut) {
	 String serverName="SDVServer?";
	fileOut.println("<HTML>");
	fileOut.println("<HEAD>");
	fileOut.println("<TITLE>Param configurations of SDVServer</TITLE>");
	fileOut.println("<SCRIPT Language = \"JavaScript\">");
	fileOut.println("<!-- ");
	fileOut.println("function change(obj){");
	fileOut.println("this.window.location = \""+ serverName +  SDVConstants.sReqType + "=" + 3 + "&" + SDVConstants.sName + "=\"+obj.name+\"&" + SDVConstants.sValue +"=\"+obj.paramName.value; \n}");
//	fileOut.println("function b_over(){");	
//	fileOut.println("this.window.location = \""+ sdvConfig.sSDVServerLocation+ "?" + SDVConstants.sReqType + "=" + Const.GET_OVERVIEW_PAGE +"\";");	
//	fileOut.println("}");
//	fileOut.println("function b_conf(){");	
//	fileOut.println("this.window.location = \""+ sdvConfig.sSDVServerLocation+ "?" + SDVConstants.sReqType + "=" + Const.GET_CONF_PAGE +"\";");	
//	fileOut.println("}");
	fileOut.println("function save_to(){");	
	fileOut.println("this.window.location = \""+ serverName +  SDVConstants.sReqType + "=" + 4 + "\";");	
	fileOut.println("}");
//	fileOut.println("function load_from(){");	
//	fileOut.println("this.window.location = \""+ sdvConfig.sSDVServerLocation+ "?" + SDVConstants.sReqType + "=" + Const.LOAD_CONF +"\";");	
//	fileOut.println("}-->");	*/
	fileOut.println("-->");	
	fileOut.println("</SCRIPT>");

	fileOut.println("</HEAD>");
	fileOut.println("<BODY  text = \"black\">");
	fileOut.println("<H3>Param configurations of SDVServer</H3><HR>");
//	fileOut.println("<input type =\"button\" value=\"Overview\" onClick =\"b_over();\">");
//	fileOut.println("<input type =\"button\" value=\"Main Config\" onClick =\"b_conf();\">");
	fileOut.println("<input type =\"button\" value=\"Save to file\" onClick =\"save_to();\">");
//	fileOut.println("<input type =\"button\" value=\"Load from file\" onClick =\"load_from();\">");
	fileOut.println("<HR>");
	fileOut.println("<TABLE  border = 2 cellpadding =5 cellspacing = 2 name=\"all\">");

	fileOut.println("<TR>");
	fileOut.println("	<TD>");
	fileOut.println("				<TABLE name=\"SDVServer\" border >");
	fileOut.println("				<TR>");
	fileOut.println("				<TH COLSPAN = 3 ALIGN = \"CENTER\">System Day Value Servlet<TH>");
	fileOut.println("				</TR>");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesRSRServerLocation+"</TD>");	
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesRSRServerLocation+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sRSRServerLocation +"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");
	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesDBDriverLocation +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesDBDriverLocation+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sDBDriverLocation +"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");
	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesDBNameRWDV +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesDBNameRWDV+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sDBNameRWDV +"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");
	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesDBRWDVLocation +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesDBRWDVLocation+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sDBRWDVLocation +"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");

	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesDBRWDVUser +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesDBRWDVUser+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sDBRWDVUser+"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");

	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesDBRWDVPass +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesDBRWDVPass+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sDBRWDVPass+"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");

	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesDBNameRWMarketDV +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesDBNameRWMarketDV+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sDBNameRWMarketDV+"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");

	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesDBRWMarketDVLocation +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesDBRWMarketDVLocation+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sDBRWMarketDVLocation+"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");

	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesDBRWMarketUser +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesDBRWMarketUser+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sDBRWMarketUser+"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");
	
	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesDBRWMarketPass +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesDBRWMarketPass+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sDBRWMarketPass+"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");

	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.namesLogFilePath +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.namesLogFilePath+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sLogFilePath+"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");
/*
	fileOut.println("\n");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+sdvConfig.sSDVCfgPath +"</TD>");
	fileOut.println("				<FORM NAME=\""+sdvConfig.sSDVCfgPath+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ sdvConfig.sSDVCfgPath+"\"></TD>");
	fileOut.println("				<TD> <INPUT TYPE=\"button\" value=\"Change\" onClick= change(this.form)></TD>");
	fileOut.println("				</FORM>");
	fileOut.println("				</TR>");
*/	
	fileOut.println(" 			</TABLE>");
	fileOut.println("	</TD>");
	fileOut.println("</TR>");
	fileOut.println(" 			</TABLE>");
	fileOut.println("</BODY></HTML>\n");
	fileOut.close();
} // sdvFormConfigPage
/**
 * Generates HTML overview page. part of the interface part of this servlet <br>
 * Creation date: (5.5.00 15:44:18) <br>
 * @param fileOut java.io.PrintWriter <br>
 */
public void sdvFormOverview(PrintWriter fileOut) {
	String serverNane = "SDVServer?";
	fileOut.println("<HTML>");
	fileOut.println("<HEAD>");
	fileOut.println("<TITLE>SDVServer Overview</TITLE>");
	fileOut.println("<SCRIPT Language = \"JavaScript\">");
	fileOut.println("<!-- ");
	fileOut.println("function config(){");
	fileOut.println("this.window.location = \"" + serverNane + SDVConstants.sReqType + "=" + 2 + "\"; \n}");
	fileOut.println("function re_in(){");
	fileOut.println("this.window.location =\"" + serverNane + SDVConstants.sReqType + "=" + 5 + "\";\n}");
	fileOut.println("function stop(){");
	fileOut.println("this.window.location =\"" + serverNane + SDVConstants.sReqType + "=" + 6 + "\";\n}");
	fileOut.println("function start(){");
	fileOut.println("this.window.location =\"" + serverNane + SDVConstants.sReqType + "=" + 7 + "\";\n}");
	fileOut.println("-->");
	fileOut.println("</SCRIPT>");
	fileOut.println("</HEAD>");
	fileOut.println("<BODY  text = \"black\">");
	fileOut.println("<HR><H3>SDVServer Overview" + "</H3>");
	String status;
	if (ready == true)
		status = "ready";
	else
		status = "closed";
	fileOut.println("<p>ver. " + ver + " / status : " + status);
	fileOut.println("<p>db connections:<p>");
	fileOut.println("<p>" + sdvConfig.sDBNameRWDV + " - " + sdvDBDVConn);
	fileOut.println("<p>" + sdvConfig.sDBNameRWMarketDV + " - " + sdvDBMarketDVConn);
	fileOut.println("<HR>");
	fileOut.println("<FORM name=\"logs\">");
	fileOut.println("<input type=\"button\" value=\"Configurations\" onClick=\"config();\">");
	fileOut.println("<input type=\"button\" value=\"Re_Init\" onClick=\"re_in();\">");
	fileOut.println("<input type=\"button\" value=\"stop\" onClick=\"stop();\">");
	fileOut.println("<input type=\"button\" value=\"start\" onClick=\"start();\">");
	fileOut.println("</FORM>");
	fileOut.println("</BODY></HTML>\n");
	fileOut.close();
}
/**
 * Get all the active market's key from the ResourceServer for request validation <br>
 * Creation date: (23.2.00 16:24:40) <br>
 */
private boolean sdvGetActiveMarkets() throws ServletException, IOException {
	// the ResourceServer address is taken from the Constants class
	String CommString = SDVConstants.sRSRReqType + "=" + SDVConstants.sRSRReqTypeValue;
	String marketList = "";
	InputStream in;
	StreamTokenizer stoken;
	try {
		URL ServletURL = new URL(sdvConfig.sRSRServerLocation + CommString);
		in = ServletURL.openStream();
		stoken = new StreamTokenizer(new BufferedReader(new InputStreamReader(in)));
	} catch (IOException E) {
		LogOutput.log("fail on comm with the resource server on getting the active markets' keys - " + E, LogOutput.ERROR);
		LogOutput.flush();
		return false;
	}
	stoken.whitespaceChars((int) SDVConstants.cInputSeparator, (int) SDVConstants.cInputSeparator);
	try {
		if (stoken.nextToken() != stoken.TT_NUMBER) {
			LogOutput.log("error in the input from the ResourceServer", LogOutput.ERROR);
			LogOutput.flush();
			return false;
		}
		int numOfValidMarkets = (int) stoken.nval;
		sdvActiveMarkets = new int[numOfValidMarkets];
		for (int counter = 0; counter < numOfValidMarkets; counter++) {
			if (stoken.nextToken() != stoken.TT_NUMBER) {
				LogOutput.log("error in the input from the ResourceServer", LogOutput.ERROR);
				LogOutput.flush();
				return false;
			}
			sdvActiveMarkets[counter] = (int) stoken.nval;
		}
	} catch (Exception e) {
		LogOutput.log("error parsing/tokenizing text", LogOutput.ERROR);
		LogOutput.flush();
		return false;
	}
	in.close();
	LogOutput.log("active market keys recieved", LogOutput.INFO);
	return true;
}
/**
 * contains all the init routines for the servlet <br>
 * Creation date: (17.3.2000 a. 17:44:30)
 */
private void sdvInit() {
	sdvConfig = new ConfigSDVServer();
	String tempCfgPath = getInitParameter(SDVConstants.sCfgPath);
	if ( tempCfgPath != null )
		sdvConfig.sSDVCfgPath = tempCfgPath;
	sdvConfig.cfgLoadProperty(sdvConfig.sSDVCfgPath);
	LogOutput = LogPrinter.makeLogPrinter(sdvConfig.sLogFilePath);
	LogOutput.setLogLevel(LogPrinter.INFO);
	LogOutput.setScreenLogLevel(LogPrinter.INFO);
	sdvLoadDriver();
	sdvDBConn();
	LogOutput.log("Init Servlet", LogOutput.INFO);
	LogOutput.flush();
}
/**
 * input the rw info in the rwMarketDayValues and rwDayvalues dbs <br>
 * try to update an existing info <br>
 * if there is not, insert a new record in the day table <br>
 * Creation date: (1/9/00 1:55:24 AM) <br>
 * @param rwKey int <br>
 * @param RWCounts int <br>
 */
private boolean sdvInputRW(long rwKey, long rwCounts, int marketKey) {
	if (ready == false) {
		LogOutput.log("RW not proceeded becouse SDV not ready", LogOutput.ERROR);
		LogOutput.flush();
		return false;
	}
	String SQLStat;
	int ResCount = 0;
	Statement Stmt;
	boolean exit = true;
	boolean result;
	int errorr_counter = 0;
	do {
		try {
			// update/insert rwMarketDayValues db
			SQLStat = "UPDATE " + sdvMarketDVTableName + " SET " + SDVConstants.sDBFieldRWCounts + " = " + SDVConstants.sDBFieldRWCounts + " + " + rwCounts + " WHERE " + SDVConstants.sDBFieldRWKey + " = " + rwKey + " AND " + SDVConstants.sDBFieldMarketKey + " = " + marketKey;
			Stmt = sdvDBMarketDVConn.createStatement();
			ResCount = Stmt.executeUpdate(SQLStat);
			Stmt.close();
			if (ResCount == 0) {
				synchronized (sdvRWSync) {
					SQLStat = "UPDATE " + sdvMarketDVTableName + " SET " + SDVConstants.sDBFieldRWCounts + " = " + SDVConstants.sDBFieldRWCounts + " + " + rwCounts + " WHERE " + SDVConstants.sDBFieldRWKey + " = " + rwKey + " AND " + SDVConstants.sDBFieldMarketKey + " = " + marketKey;
					Stmt = sdvDBMarketDVConn.createStatement();
					ResCount = Stmt.executeUpdate(SQLStat);
					Stmt.close();
					if (ResCount == 0) {
						SQLStat = "insert into " + sdvMarketDVTableName + "(" + SDVConstants.sDBFieldRWKey + ", " + SDVConstants.sDBFieldRWCounts + ", " + SDVConstants.sDBFieldMarketKey + ") " + "values (" + rwKey + ", " + rwCounts + ", " + marketKey + ")";
						Stmt = sdvDBMarketDVConn.createStatement();
						ResCount = Stmt.executeUpdate(SQLStat);
						Stmt.close();
					}
				}
			}
			// update/insert rwDayValues db
			SQLStat = "update " + sdvDVTableName + " set " + SDVConstants.sDBFieldRWCounts + " = " + SDVConstants.sDBFieldRWCounts + " + " + rwCounts + " where " + SDVConstants.sDBFieldRWKey + " = " + rwKey;
			Stmt = sdvDBDVConn.createStatement();
			ResCount = Stmt.executeUpdate(SQLStat);
			Stmt.close();
			if (ResCount == 0) {
				synchronized (sdvRWSync) {
					SQLStat = "update " + sdvDVTableName + " set " + SDVConstants.sDBFieldRWCounts + " = " + SDVConstants.sDBFieldRWCounts + " + " + rwCounts + " where " + SDVConstants.sDBFieldRWKey + " = " + rwKey;
					Stmt = sdvDBDVConn.createStatement();
					ResCount = Stmt.executeUpdate(SQLStat);
					Stmt.close();
					if (ResCount == 0) {
						SQLStat = "insert into " + sdvDVTableName + "(" + SDVConstants.sDBFieldRWKey + ", " + SDVConstants.sDBFieldRWCounts + ") " + "values (" + rwKey + ", " + rwCounts + ")";
						Stmt = sdvDBDVConn.createStatement();
						ResCount = Stmt.executeUpdate(SQLStat);
						Stmt.close();
					}
				}
			}
			result = true;
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on inputing the rw in the db - sql exception: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !sdvServeConnection();
			result = false;
			errorr_counter++;
		}
	} while (!exit && errorr_counter < 3);
	return result;
}
/**
 * Loads the db driver <br>
 * it must be executed before trying to establish a connection with the db <br>
 * Creation date: (4.5.00 11:43:28)
 * @return boolean
 */
private boolean sdvLoadDriver() {
	// load the driver
	try {
		Class.forName(sdvConfig.sDBDriverLocation).newInstance();
		return true;
	} catch (Exception E) {
		LogOutput.log("fail on loading dbDriver " + E, LogOutput.ERROR);
		LogOutput.flush();
		return false;
	}
}
/**
 * put all the recieved info from the mDayValue Server in the proper rwDayValuesTable <br>
 * Creation date: (1/9/00 1:53:04 AM) <br>
 */
private void sdvProcInfo(long[] rwKeys, long[] rwCounts, int marketKey) {
	for (int Counter = 0; Counter < rwKeys.length; Counter++) {
		sdvInputRW(rwKeys[Counter], rwCounts[Counter], marketKey);
	}
}
/**
 * Saves the cfg file
 * Creation date: (07.3.2000 a. 16:38:17)
 * @param req HttpServletRequest 
 */
public void sdvSaveCfgFile() {
	
	sdvConfig.cfgSaveProperty( sdvConfig.sSDVCfgPath );
}
/**
 * checks what is the state of the db connection and restores/establish it if needed <br>
 * Creation date: (4.5.00 12:17:56) <br>
 * @return boolean <br>
 */
private boolean sdvServeConnection() {
	if (!sdvCheckConnection()) {
		if (!sdvDBConn()) {
			LogOutput.log("fail on restoring the db-connection", LogOutput.ERROR);
			LogOutput.flush();
			return false;
		} else {
			LogOutput.log("db-connection restored", LogOutput.INFO);
			LogOutput.flush();
			return true;
		}
	} else {
		LogOutput.log("db-connection checked, found active", LogOutput.INFO);
		LogOutput.flush();
		return true;
	}
}
/**
 * compose a proper table name according to the date <br>
 * check if such table exist and if not, creates it <br>
 * put the table's name in the mdvTableName field <br>
 * Creation date: (1/8/00 12:35:59 AM) <br>
 */
private void sdvSetTablesNames() {
	String ToDay = String.valueOf(new java.sql.Date(System.currentTimeMillis()));
	ToDay = ToDay.substring(0, 4) + ToDay.substring(5, 7) + ToDay.substring(8, 10);
	String newDVTableName = SDVConstants.sDBRWDayValuesTable + ToDay;
	String newMarketDVTableName = SDVConstants.sDBRWMarketDayValuesTable + ToDay;
	// check / create the DV tables
	if (sdvDVTableName == null || !sdvDVTableName.equals(newDVTableName)) {
		sdvDVTableName = newDVTableName;
		if (!sdvCheckIfExist(sdvDVTableName, sdvDBDVConn)) {
			sdvCreateTable(sdvDVTableName, sdvDBDVConn);
		}
	} else {
		if (sdvDVTableName.equals(newDVTableName)) {
			if (!sdvCheckIfExist(sdvDVTableName, sdvDBDVConn)) {
				sdvCreateTable(sdvDVTableName, sdvDBDVConn);
			}
		}
	}
	// check / create the MarketDV table
	if (sdvMarketDVTableName == null || !sdvMarketDVTableName.equals(newMarketDVTableName)) {
		sdvMarketDVTableName = newMarketDVTableName;
		if (!sdvCheckIfExist(sdvMarketDVTableName, sdvDBMarketDVConn)) {
			sdvCreateTable(sdvMarketDVTableName, sdvDBMarketDVConn);
		}
	} else {
		if (sdvMarketDVTableName.equals(newMarketDVTableName)) {
			if (!sdvCheckIfExist(sdvMarketDVTableName, sdvDBMarketDVConn)) {
				sdvCreateTable(sdvMarketDVTableName, sdvDBMarketDVConn);
			}
		}
	}
}
/**
 * recieve and proceed all the http requests <br>
 * Creation date: (1/7/00 11:02:22 AM) <br>
 */
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException {
	// get a pointer to the response location
	PrintWriter out = res.getWriter();
	int sTask;
	try {
		sTask = Integer.valueOf(req.getParameter(SDVConstants.sReqType)).intValue();
	} catch (NumberFormatException e) {
		out.println("false");
		out.close();
		LogOutput.log("bad data type of the reqType", LogOutput.ERROR);
		LogOutput.flush();
		return;
	}
	// check if this is a valid task
	if (sTask < 0 && sTask > 5) {
		out.println("false");
		out.close();
		LogOutput.log("bad value of the reqType", LogOutput.ERROR);
		LogOutput.flush();
		return;
	}
	switch (sTask) {
		case 0 :
			// overview
			sdvFormOverview(out);
			break;
		case 1 :
			// get the input and check if it valid / proceed it
			// get the marketKey from the request
			if (ready == false) {
				out.println("false");
				out.close();
				LogOutput.log("request not proceeded becouse SDV not ready", LogOutput.ERROR);
				LogOutput.flush();
				return;
			}
			int marketKey;
			try {
				marketKey = Integer.valueOf(req.getParameter(SDVConstants.sMarketKey)).intValue();
			} catch (NumberFormatException e) {
				out.println("false");
				out.close();
				LogOutput.log("bad data type of the marketKey", LogOutput.ERROR);
				LogOutput.flush();
				return;
			}

			// get the list with the valid markets
			if (sdvActiveMarkets == null) {
				if (!sdvGetActiveMarkets()) {
					out.println("false");
					out.close();
					LogOutput.log("fail on recieving the active markets' list", LogOutput.ERROR);
					LogOutput.flush();
					return;
				}
				LogOutput.log("active markets' list recieved", LogOutput.INFO);
			}
			if (!sdvCheckForActiveMarket(marketKey)) {
				out.println("false");
				out.close();
				LogOutput.log("request from a not - valid market", LogOutput.ERROR);
				LogOutput.flush();
				return;
			}
			int numWord;
			try {
				numWord = Integer.valueOf(req.getParameter(SDVConstants.sNumWord)).intValue();
			} catch (NumberFormatException e) {
				out.println("false");
				out.close();
				LogOutput.log("bad data type of the numWord", LogOutput.ERROR);
				LogOutput.flush();
				return;
			}
			if (!(numWord > 0)) {
				out.println("false");
				out.close();
				LogOutput.log("bad value of the numWord", LogOutput.ERROR);
				LogOutput.flush();
				return;
			}
			// compopse and set the proper table name by date and marketKey
			sdvSetTablesNames();
			// organize and get the rest of the input; check if it is valid
			long[] rwKeys = new long[numWord];
			long[] rwCounts = new long[numWord];
			for (int counter = 0; counter < numWord; counter++) {
				try {
					rwKeys[counter] = Long.valueOf(req.getParameter(SDVConstants.sRWKey + (counter + 1))).longValue();
					rwCounts[counter] = Long.valueOf(req.getParameter(SDVConstants.sRWCounts + (counter + 1))).longValue();
				} catch (NumberFormatException e) {
					out.println("false");
					out.close();
					LogOutput.log("bad data type of the rwKeys/rwCounts : " + req.getQueryString() + " exception generatede : " + e, LogOutput.ERROR);
					LogOutput.flush();
					return;
				}
				if (!(rwKeys[counter] > 0 && rwCounts[counter] > 0)) {
					out.println("false");
					out.close();
					LogOutput.log("bad value of the rwKeys/rwCounts", LogOutput.ERROR);
					LogOutput.flush();
					return;
				}
			}
			// proceed the information
			sdvProcInfo(rwKeys, rwCounts, marketKey);
			break;
		case 2 :
			// returns config page
			sdvFormConfigParam(out);
			break;
		case 3 :
			// change parameters
			sdvChangeParams(req);
			sdvFormConfigParam(out);
			break;
		case 4 :
			// saves parameters into a file
			sdvSaveCfgFile();
			sdvFormConfigParam(out);
			break;
		case 5 :
			// re - init servlet
			sdvInit();
			sdvFormOverview(out);
			break;
		case 6 :
			// stop responding to market requests
			ready = false;
			sdvFormOverview(out);
		case 7 :
			// stop responding to market requests
			ready = true;
			sdvFormOverview(out);
		}
	LogOutput.flush();
	out.close();
}
}

