package system.srcserver;

import java.net.*;
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import Src;
import SRCConstants;
import ConfigSrcServer;

/**
 * contain and manage all the SrcServer activities <br>
 * Creation date: (12/20/99 1:56:24 AM) <br>
 * @author: lex <br>
 * <br>
 * functions description: <br>
 *  <br>
 * ReqType = 0 <br>
 * Overview page<br>
 * command string: <br>
 * SrcServer?ReqType=0 <br>
 * returns: <br>
 * html <br>
 *  <br>
 * ReqType = 1 <br>
 * resolve srcKey to srcString <br>
 * command string: <br>
 * SrcServer?ReqType=1&srcKey=1&marketKey=1 <br>
 * returns: <br>
 * srcString/null <br>
 *  <br>
 * ReqType = 2 <br>
 * resolve srcString&langKey to srcKey <br>
 * command string: <br>
 * SrcServer?ReqType=2&srcString=www.yahoo.com&langKey=1&marketKey=1 <br>
 * returns: <br>
 * srcKey <br>
 *  <br>
 * ReqType = 3 <br>
 * count Src by srcKey <br>
 * command string: <br>
 * SrcServer?ReqType=3&srcKey=1&marketKey=1&schedSrcKey=1&srcTitle=Going+home&parSrcKey=4 <br>
 * returns: <br>
 * SrcString/null <br>
 *  <br>
 * ReqType = 31 <br>
 * reports the time for proceeding a schedSrc and the number of child Src dor it <br>
 * command string: <br>
 * SrcServer?ReqType=31&marketKey=1&schedSrcKey=1&procTime=1068&numSrc=203 <br>
 * returns: <br>
 * true/false <br>
 *  <br>
 * ReqType = 4 <br>
 * register schedSrc <br>
 * command string: <br>
 * SrcServer?ReqType=4&srcString=www.altavista.com&langKey=1&marketKey=1&timeBase=30& <br>
 * frequence=1&keepInPath=0&keepInDomain=0&grabLevels=3&userAgent=Mozilla+4.0 <br>
 * returns: <br>
 * srcKey <br>
 *  <br>
 * ReqType = 41 <br>
 * activate / deactivate schedSrc for the market schedule <br>
 * command string: <br>
 * SrcServer?ReqType=41&marketKey=1&schedSrcKey=1&active=1 <br>
 *  <br>
 * ReqType = 5 <br>
 * Build market's schedule <br>
 * command string: <br>
 * SrcServer?ReqType=5&marketKey=1 <br>
 * returns: <br>
 * srcKey | timeBase | frequence | keepInPath | keepInDomain | lastChecked | grabLevels | langKey | schedActive | userAgent <br>
 *  <br>
 * ReqType = 6 <br>
 * delete schedSrc for market schedule <br>
 * command string: <br>
 * SrcServer?ReqType=6&marketKey=1&schedSrcKey=1 <br>
 * returns: <br>
 * true / false <br>
 *  <br>
 * ReqType = 61 <br>
 * delete schedSrc for su interface <br>
 * command string: <br>
 * SrcServer?ReqType=61&reqMarketKey=1&schedSrcKey=1 <br>
 * returns: <br>
 * html page <br>
 *  <br>
 * ReqType = 7 <br>
 * edit shcedSrcKey for a market
 * command string: <br>
 * SrcServer?ReqType=7&schedSrcKey=11&marketKey=1&timeBase=75&frequence=1&keepInPath=0&keepInDomain=0&grabLevels=2&userAgent=Mozilla+4.0 <br>
 * returns: <br>
 * true - if success
 * false - if error
 *
 * ReqType = 8 <br>
 * returns configuration page <br>
 * command string: <br>
 * SrcServer?ReqType=8&marketKey=1 <br>
 * returns: <br>
 * html<br>
 *
 * ReqType = 9 <br>
 * change server parameter<br>
 * command string: <br>
 * SrcServer?ReqType=9&name=RSRServerLocation&value=http://www.server.esof/lext/ResourceServer? <br>
 * returns: <br>
 * html<br>
 *
 * ReqType = 10 <br>
 * saves server parameters to file <br>
 * command string: <br>
 * SrcServer?ReqType=10 <br>
 * returns: <br>
 * html<br>
 *
 * ReqType = 11 <br>
 * returns a html page with all sourses for selected market  <br>
 * command string: <br>
 * SrcServer?ReqType=11&marketKey=1 <br>
 * returns: <br>
 * html<br>
 *
 * ReqType = 12 <br>
 * re - init the servlet <br>
 * command string: <br>
 * SrcServer?ReqType=12&marketKey=1 <br>
 * returns: <br>
 * nothing<br>
 */
public class SrcServer extends HttpServlet {
	private static Connection srcDBConn;
	private static int[] srcActiveMarkets;
	private static LogPrinter LogOutput;
	private static int srcCounter = 0;
	private static ConfigSrcServer srcConfig;
	private static Object srcDBSync = new Object();
	private static Object srcSrcSrcRelTableSync = new Object();
	private static Object srcSrcSync = new Object();
	public final static String ver = "AAA028 | 000831 ";
	
/**
 * SrcServer constructor.
 */
public SrcServer() {
	super();
}
public final static String DBString(String Str) {
	char escape1 = '\'';
	char escape2 = '\\';
	if (Str == null || Str.equals(""))
		return null;
	else {
		StringBuffer Result_string = new StringBuffer();
		Result_string.append(escape1);
		for (int i = 0; i < Str.length(); i++) {
			if (Str.toLowerCase().charAt(i) == escape1 || Str.toLowerCase().charAt(i) == escape2) {
				Result_string.append(escape2);
			}
			Result_string.append(Str.charAt(i));
		}
		Result_string.append(escape1);
		return Result_string.toString();
	}
}
/**
 * the destroy method of the servlet <br>
 * closes the connection to the db using the srcDBDisConnect() method<br>
 * Creation date: (15.2.00 15:01:42) <br>
 */
public void destroy() {
	srcDBDisConnect();
}
/**
 * this is the init method of the servlet. <br>
 * calls the srcInit() method <br>
 * Creation date: (15.2.00 14:58:31) <br>
 */
public void init(ServletConfig config) throws ServletException {
	super.init(config); //This statement must always be here !!!
	srcInit();
}
/**
 * Insert the method's description here.
 * Creation date: (25.7.00 11:21:34)
 * @param args java.lang.String[]
 */
public static void main(String[] args) {
	String name = "saso's";
	String testString = "select * from abc where name = " + DBString(name);
	System.out.println(testString);
}
/**
 * serves the http comm <br>
 * controls the processing of the requests <br>
 * Creation date: (12/25/99 2:34:41 PM) <br>
 */
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException {
	String srcString;
	int srcKey;
	int sTask;
	Src GivenSrc = new Src();
	PrintWriter out = res.getWriter();
	int marketKey = 0;
	try {
		sTask = Integer.valueOf(req.getParameter(SRCConstants.sReqType)).intValue();
		// going to get and check the marketKey from the request if there is
		if (sTask != 0 && sTask != 8 && sTask != 9 && sTask != 10 && sTask != 11 && sTask != 12) {
			// if the list with the active markets is not here try to load it if the request needs it
			if (srcActiveMarkets == null) {
				if (!srcGetActiveMarkets()) {
					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);
			}
			marketKey = Integer.valueOf(req.getParameter(SRCConstants.sMarketKey)).intValue();
			// check if the request comes from a valid market, if it is a market type of request
			if (!srcCheckForActiveMarket(marketKey)) {
				LogOutput.log("the request is from a not-valid market", LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
		}
	} catch (NumberFormatException e) {
		LogOutput.log("bad data type of the reqType or of the marketKey in the input - NumberFormatException - " + e + " - on request : " + req.getQueryString(), LogOutput.ERROR);
		out.println("false");
		out.close();
		LogOutput.flush();
		return;
	}
	if ((sTask < 0 || sTask > 12) && sTask != 41 && sTask != 61 && sTask != 31) {
		LogOutput.log("invalid ReqType value", LogOutput.ERROR);
		out.println("false");
		out.close();
		LogOutput.flush();
		return;
	}
	switch (sTask) {
		case 0 :
			// Overview page
			srcFormOverview(out);
			break;
		case 1 :
			// resolve srcKey to srcString
			LogOutput.log("going to resolve srcKey to srcString", LogOutput.INFO);
			try {
				GivenSrc.srcKey = Long.valueOf(req.getParameter(SRCConstants.sSrcKey)).longValue();
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the srcKey : " + e, LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			} catch (Exception e) {
				LogOutput.log("exception on reading the srcKey from the req : " + e, LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			GivenSrc = srcLoadSource(GivenSrc);
			if (GivenSrc == null) {
				LogOutput.log("Source not loaded, abort!", LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			out.print(GivenSrc.srcString);
			LogOutput.log("resolve srcKey to srcString finished", LogOutput.INFO);
			break;
		case 2 :
			// resolve srcString&langKey to srcKey
			LogOutput.log("going to resolve srcString&langKey to srcKey", LogOutput.INFO);
			try {
				GivenSrc.srcString = req.getParameter(SRCConstants.sSrcString);
				GivenSrc.langKey = Integer.valueOf(req.getParameter(SRCConstants.sLangKey)).intValue();
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the langKey", LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			GivenSrc = srcResolveString(GivenSrc);
			out.print(GivenSrc.srcKey);
			LogOutput.log("resolve srcString&langKey to srcKey finished", LogOutput.INFO);
			break;
		case 3 :
			// count src by srcKey
			LogOutput.log("going to count src by srcKey", LogOutput.INFO);
			try {
				GivenSrc.srcKey = Long.valueOf(req.getParameter(SRCConstants.sSrcKey)).longValue();
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the srcKey", LogOutput.ERROR);
				System.out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			GivenSrc = srcLoadSource(GivenSrc);
			try {
				GivenSrc.marketKey = marketKey;
				GivenSrc.schedSrcKey = Long.valueOf(req.getParameter(SRCConstants.sSchedSrcKey)).longValue();
				GivenSrc.srcTitle = req.getParameter(SRCConstants.sSrcTitle);
				GivenSrc.parSrcKey = Integer.valueOf(req.getParameter(SRCConstants.sParSrcKey)).intValue();
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the schedSrckey or of the parSrcKey", LogOutput.ERROR);
				System.out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			if (GivenSrc.srcKey == GivenSrc.schedSrcKey) {
				if (srcCheckSchedSrc(GivenSrc))
					srcServeSchedCountRel(GivenSrc);
				else {
					LogOutput.log("not sche src given as a ched one: srcKey " + GivenSrc.srcKey + " on market " + GivenSrc.marketKey, LogOutput.ERROR);
					System.out.println("false");
					out.close();
					LogOutput.flush();
					return;
				}
			} else {
				srcServeSrcCountRel(GivenSrc);
				srcSolveSrcSrcRel(GivenSrc);
			}
			LogOutput.log("count src by srcKey finished", LogOutput.INFO);
			break;
		case 31 :
			// reports the time for proceeding a schedSrc and the number of child Src dor it
			// SrcServer?ReqType=31&marketKey=1&schedSrcKey=1&procTime=1068&numSrc=203
			LogOutput.log("going to update procTime and numSrc", LogOutput.INFO);
			try {
				GivenSrc.marketKey = marketKey;
				GivenSrc.schedSrcKey = Integer.valueOf(req.getParameter(SRCConstants.sSchedSrcKey)).intValue();
				GivenSrc.srcKey = GivenSrc.schedSrcKey;
				GivenSrc.lastProcTime = Integer.valueOf(req.getParameter(SRCConstants.sProcTime)).intValue();
				GivenSrc.numSrc = Integer.valueOf(req.getParameter(SRCConstants.sNumSrc)).intValue();
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the schedSrcKey||procTime||numSrc", LogOutput.ERROR);
				out.print("false");
				out.close();
				LogOutput.flush();
				return;
			}
			if (!srcCheckSchedSrc(GivenSrc)) {
				LogOutput.log("trying to update stat about schedSrc with not schedSrc", LogOutput.ERROR);
				out.print("false");
				out.close();
				LogOutput.flush();
				return;
			}
			GivenSrc = srcLoadSchedSrc(GivenSrc);
			out.print(srcUpdateSchedSrcStats(GivenSrc));
			out.close();
			LogOutput.log("end of updating procTime and numSrc", LogOutput.INFO);
			LogOutput.flush();
			break;
		case 4 :
			// register schedSrc
			LogOutput.log("going to register schedSrc", LogOutput.INFO);
			try {
				GivenSrc.srcString = req.getParameter(SRCConstants.sSrcString);
				GivenSrc.langKey = Integer.valueOf(req.getParameter(SRCConstants.sLangKey)).intValue();
				GivenSrc.marketKey = marketKey;
				GivenSrc.timeBase = Integer.valueOf(req.getParameter(SRCConstants.sTimeBase)).intValue();
				GivenSrc.frequence = Integer.valueOf(req.getParameter(SRCConstants.sFrequence)).intValue();
				GivenSrc.keepInPath = Integer.valueOf(req.getParameter(SRCConstants.sKeepInPath)).intValue();
				GivenSrc.keepInDomain = Integer.valueOf(req.getParameter(SRCConstants.sKeepInDomain)).intValue();
				GivenSrc.grabLevels = Integer.valueOf(req.getParameter(SRCConstants.sGrabLevels)).intValue();
				GivenSrc.userAgent = req.getParameter(SRCConstants.sUserAgent);
				GivenSrc.schedActive = 0;
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the langKey||timeBase||frequence||keepInPath||keepInDomain||grablevels", LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			GivenSrc = srcResolveString(GivenSrc);
			srcResolveIntRel(GivenSrc);
			out.print(GivenSrc.srcKey);
			LogOutput.log("register schedSrc finished", LogOutput.INFO);
			break;
		case 41 :
			LogOutput.log("going to activate a SchedSrc for a market's Sched", LogOutput.INFO);
			// activate / deactivate schedSrc for the market schedule
			// SrcServer?ReqType=41&marketKey=1&schedSrcKey=1&active=true
			try {
				GivenSrc.marketKey = marketKey;
				GivenSrc.schedSrcKey = Long.valueOf(req.getParameter(SRCConstants.sSchedSrcKey)).longValue();
				GivenSrc.srcKey = GivenSrc.schedSrcKey;
				GivenSrc.schedActive = Byte.valueOf(req.getParameter(SRCConstants.sSchedActive)).byteValue();
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the schedActive||schedSrcKey - NumberFormatException : " + e + " | on request : " + req.getQueryString(), LogOutput.ERROR);
				LogOutput.flush();
				out.println("false");
				out.close();
				return;
			}
			if (!srcSetSchedActive(GivenSrc)) {
				LogOutput.log("fail on changing the schedActive status of a src | on request : " + req.getQueryString(), LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			} else {
				out.println("true");
				out.close();
			}
			LogOutput.log("activate a SchedSrc for a market's Sched finished", LogOutput.INFO);
			LogOutput.flush();
			break;
		case 5 :
			// build schedule for a market
			LogOutput.log("going to build a schedule for market " + marketKey, LogOutput.INFO);
			Vector Result = srcBuildSchedule(marketKey);
			Src NewSrc = new Src();
			int counter;
			String OutPut;
			for (counter = 0; counter < Result.size(); counter++) {
				NewSrc = (Src) Result.elementAt(counter);
				OutPut = String.valueOf(NewSrc.srcKey) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.timeBase) + "|" + String.valueOf(NewSrc.frequence);
				OutPut = OutPut + "|" + String.valueOf(NewSrc.keepInPath) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.keepInDomain) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.lastChecked) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.grabLevels) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.langKey) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.schedActive) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.userAgent) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.numSrc) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.lastProcTime) + "|";
				OutPut = OutPut + String.valueOf(NewSrc.avgProcTime);
				out.println(OutPut);
			}
			LogOutput.log("building sched for market finished", LogOutput.INFO);
			break;
		case 6 :
			// delete schedSrc
			LogOutput.log("going to delete schedSrc for a market schedue", LogOutput.INFO);
			try {
				GivenSrc.marketKey = marketKey;
				GivenSrc.schedSrcKey = Long.valueOf(req.getParameter(SRCConstants.sSchedSrcKey)).longValue();
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the schedSrcKey", LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			if (srcDeleteSrc(GivenSrc))
				out.print("true");
			else {
				LogOutput.log("deleting schedSrc failed", LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			LogOutput.log("end of deleting schedSrc for a market schedue", LogOutput.INFO);
			break;
		case 61 :
			// SrcServer?ReqType=61&marketKey=1&schedSrcKey=1
			LogOutput.log("going to delete schedSrc for a su interface", LogOutput.INFO);
			GivenSrc.marketKey = marketKey;
			try {
				GivenSrc.schedSrcKey = Long.valueOf(req.getParameter(SRCConstants.sSchedSrcKey)).longValue();
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the schedSrcKey : " + e, LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			if (!srcDeleteSrc(GivenSrc)) {
				LogOutput.log("deleting schedSrc failed", LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			srcFormMarketSrcTab(out, marketKey);
			LogOutput.log("end of deleting schedSrc for a su interface", LogOutput.INFO);
			break;
		case 7 :
			// edit schedSrcKey
			LogOutput.log("going to edit schedSrcKey", LogOutput.INFO);
			try {
				GivenSrc.schedSrcKey = Long.valueOf(req.getParameter(SRCConstants.sSchedSrcKey)).longValue();
				GivenSrc.marketKey = marketKey;
				GivenSrc.timeBase = Integer.valueOf(req.getParameter(SRCConstants.sTimeBase)).intValue();
				GivenSrc.frequence = Integer.valueOf(req.getParameter(SRCConstants.sFrequence)).intValue();
				GivenSrc.keepInPath = Integer.valueOf(req.getParameter(SRCConstants.sKeepInPath)).intValue();
				GivenSrc.keepInDomain = Integer.valueOf(req.getParameter(SRCConstants.sKeepInDomain)).intValue();
				GivenSrc.grabLevels = Integer.valueOf(req.getParameter(SRCConstants.sGrabLevels)).intValue();
				GivenSrc.userAgent = req.getParameter(SRCConstants.sUserAgent);
			} catch (NumberFormatException e) {
				LogOutput.log("bad data type of the schedSrcKey||timeBase||frequence||keepInPath||keepInDomain||grablevels||userAgent", LogOutput.ERROR);
				out.println("false");
				out.close();
				LogOutput.flush();
				return;
			}
			boolean editRes = srcEditSchedSrc(GivenSrc);
			out.print(editRes);
			LogOutput.log("edit schedSrcKey finished", LogOutput.INFO);
			break;
		case 8 :
			// bring html page for configuration
			srcFormConfigParam(out);
			break;
		case 9 :
			// change server parameters
			srcChangeParams(req);
			srcFormConfigParam(out);
			break;
		case 10 :
			// saves server parameters to file 
			srcSaveCfgFile();
			srcFormConfigParam(out);
			break;
		case 11 :
			// returns a html page with all sourses for selected market
			int reqMarketKey = Integer.valueOf(req.getParameter(SRCConstants.sReqMarketKey)).intValue();
			srcGetActiveMarkets();
			if (srcActiveMarkets.length > 0) {
				if (reqMarketKey == 0)
					reqMarketKey = srcActiveMarkets[0];
				srcFormMarketSrcTab(out, reqMarketKey);
			} else
				out.println("no active markets");
			break;
		case 12 :
			// re - init the servlet
			srcInit();
			srcFormOverview(out);
			break;
	}
	LogOutput.flush();
	out.close();
}
/**
 * Inserts a new record, representing a relation between <br>
 * parent and child src, in the SrcSrcRelTable <br>
 * Creation date: (22.2.00 14:04:08) <br>
 * @param GivenSrc system.srcserver.Src <br>
 * @param tableName java.lang.String <br>
 */
private boolean srcAddSrcSrcRel(Src GivenSrc, String srcSrcRelTableName) {
	String SQLSelectStat = "select " + SRCConstants.sDBFieldSrcSrcRelKey + " from " + srcSrcRelTableName + " where " + SRCConstants.sDBFieldParSrcKey + " = " + GivenSrc.parSrcKey + " AND " + SRCConstants.sDBFieldChildSrcKey + " = " + GivenSrc.srcKey;
	boolean result;
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Statement Stmt = srcDBConn.createStatement();
			// check if the such record allready exist
			// if does, that means that there is no need to add/update new record -> return
			ResultSet RS = Stmt.executeQuery(SQLSelectStat);
			if (RS.next())
				return true;
			RS.close();
			// no such record -> add it
			long newSrcSrcRelKey = srcGetNewSrcSrcRelKey(GivenSrc.parSrcKey, srcSrcRelTableName);
			String SQLInsertStat = "insert into " + srcSrcRelTableName + " (" + SRCConstants.sDBFieldSrcSrcRelKey + ", " + SRCConstants.sDBFieldParSrcKey + ", " + SRCConstants.sDBFieldChildSrcKey + ", " + SRCConstants.sDBFieldLastChecked + ") values (" + newSrcSrcRelKey + ", " + GivenSrc.parSrcKey + ", " + GivenSrc.srcKey + ", '" + new java.sql.Date(System.currentTimeMillis()) + "')";
			Stmt.executeQuery(SQLInsertStat);
			Stmt.close();
			exit = true;
			result = true;
		} catch (SQLException E) {
			LogOutput.log("fail on addSrcSrcRel - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			result = false;
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	return result;
}
/**
 * builds an array object with all the source info that a market's schedule needs <br>
 * Creation date: (12/20/99 3:43:55 AM) <br>
 * @return srcserver.Src[] <br>
 * @param marketKey int <br>
 */
private Vector srcBuildSchedule(int marketKey) {
	Vector reqSrcs = new Vector(0, 50);
	int counter = 0;
	String SQLQuery = "select " + SRCConstants.sDBSrcTable + "." + SRCConstants.sDBFieldSrcKey + ", " + SRCConstants.sDBFieldTimeBase + ", " + SRCConstants.sDBFieldFrequence + ", " + SRCConstants.sDBFieldKeepInPath + ", " + SRCConstants.sDBFieldSchedLastChecked + ", " + SRCConstants.sDBFieldGrabLevels + ", " + SRCConstants.sDBFieldLangKey + ", " + SRCConstants.sDBFieldKeepInDomain + ", " + SRCConstants.sDBFieldSchedActive + ", " + SRCConstants.sDBFieldUserAgent + ", " + SRCConstants.sDBFieldNumSrc + ", " + SRCConstants.sDBFieldLastProcTime + ", " + SRCConstants.sDBFieldAvgProcTime + " from " + SRCConstants.sDBMarketSchedSrcTable + ", " + SRCConstants.sDBSrcTable + " where " + SRCConstants.sDBFieldMarketKey + " = " + marketKey + " and " + SRCConstants.sDBSrcTable + "." + SRCConstants.sDBFieldSrcKey + " = " + SRCConstants.sDBMarketSchedSrcTable + "." + SRCConstants.sDBFieldSchedSrcKey + " and " + SRCConstants.sDBFieldActive + " = 1";
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			int count;
			Statement Stmt = srcDBConn.createStatement();
			ResultSet RS = Stmt.executeQuery(SQLQuery);
			while (RS.next()) {
				Src TempSrc = new Src();
				TempSrc.srcKey = RS.getInt(1);
				TempSrc.timeBase = RS.getInt(2);
				TempSrc.frequence = RS.getInt(3);
				TempSrc.keepInPath = RS.getInt(4);
				TempSrc.keepInDomain = RS.getInt(8);
				TempSrc.lastChecked = RS.getDate(5);
				TempSrc.grabLevels = RS.getInt(6);
				TempSrc.langKey = RS.getInt(7);
				TempSrc.schedActive = RS.getByte(9);
				TempSrc.userAgent = RS.getString(10);
				TempSrc.numSrc = RS.getInt(11);
				TempSrc.lastProcTime = RS.getInt(12);
				TempSrc.avgProcTime = RS.getInt(13);
				reqSrcs.addElement(TempSrc);
			}
			RS.close();
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			exit = !srcServeConnection();
			LogOutput.log("fail on building schedule - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			reqSrcs = null;
			error_counter++;
		} catch (Exception E) {
			LogOutput.log("fail on building schedule - Exception: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			reqSrcs = null;
			error_counter = 3;
		}
	} while (!exit && error_counter < 3);
	return reqSrcs;
}
/**
 * This method is part of the configuration part of this servlet. <br>
 * Changes a parameter value by a http request <br>
 * Creation date: (07.3.2000 a. 16:38:17) <br>
 * @param req HttpServletRequest <br>
 */
public void srcChangeParams(HttpServletRequest req) {
	String paramName = "";
	String paramValue = "";
	try {
		paramName = req.getParameter(SRCConstants.sName);
		paramValue = req.getParameter(SRCConstants.sValue);
	} catch (NumberFormatException e) {
		LogOutput.log("bad data type for config parameter name", LogOutput.ERROR);
		LogOutput.flush();
		return;
	}
	srcConfig.setParam(paramName, paramValue);
}
/**
 * checks if the conection is closed or is null <br> 
 * returns true if the connection is ok <br>
 * returns false if the connection is null or is closed <br>
 * Creation date: (4/24/00 6:16:46 PM) <br>
 * @return boolean <br>
 */
private boolean srcCheckConnection() {
	try {
		if (!srcDBConn.isClosed() && srcDBConn != 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 srcCheckForActiveMarket(int marketKey) {
	if (srcActiveMarkets == null) return false;
	if (srcActiveMarkets.length == 0) return false;
	for (int counter = 0; counter < srcActiveMarkets.length; counter++)
		if (srcActiveMarkets[counter] == marketKey) return true;
	return false;
}
/**
 * Checks if a specific SrcSrcRelTable Exist <br>
 * Creation date: (22.2.00 11:57:28) <br>
 * @return boolean <br>
 * @param tableName java.lang.String <br>
 */
private boolean srcCheckIfSrcSrcRelTableExist(String srcSrcRelTableName) {
	String SQLQuery = "SHOW TABLES LIKE " + DBString(srcSrcRelTableName);
	boolean Res = false;
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Statement Stmt = srcDBConn.createStatement();
			ResultSet RS = Stmt.executeQuery(SQLQuery);
			if (RS.next())
				Res = true;
			else
				Res = false;
			RS.close();
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on checking if the SrcSrcRelTable exist - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	return Res;
}
/**
 * checks if a given src is a sched one for a specific market <br>
 * Creation date: (01.3.2000 a. 10:51:29) <br>
 * @return boolean <br>
 * @param srcKey int <br>
 */
private boolean srcCheckSchedSrc(Src GivenSrc) {
	String SQLStat = "SELECT " + SRCConstants.sSchedSrcKey + " FROM " + SRCConstants.sDBMarketSchedSrcTable + " WHERE " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.srcKey + " AND " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " AND " + SRCConstants.sDBFieldActive + " = 1";
	boolean exit = true;
	int error_counter = 0;
	boolean result;
	do {
		try {
			Statement Stmt = srcDBConn.createStatement();
			ResultSet RS = Stmt.executeQuery(SQLStat);
			if (RS.next()) 
				result = true;
			else
				result = false;
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on checking schedSrc - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			error_counter++;
			result = false;
		}
	} while (!exit && error_counter < 3);
	return result;
}
/**
 * when Src to Src relations are about to be registred, the existing relations <br>
 * of the parent Src are not more up-to-date. this method removes them from the db. <br>
 * Creation date: (22.2.00 13:30:13) <br>
 * @param GivenSrc system.srcserver.Src <br>
 */
private boolean srcClearOldSrcSrcRelRecords(Src GivenSrc, String srcSrcRelTableName) {
	String SQLStat = "delete from " + srcSrcRelTableName + " where " + SRCConstants.sDBFieldLastChecked + " < " + new java.sql.Date(System.currentTimeMillis()) + " AND " + SRCConstants.sDBFieldParSrcKey + " = " + GivenSrc.parSrcKey;
	boolean result;
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Statement Stmt = srcDBConn.createStatement();
			Stmt.executeQuery(SQLStat);
			Stmt.close();
			result = true;
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on clearing old srcSrcRelRecords - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			result = false;
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	return result;
}
/**
 * creates a SrcSrcRelTable by a given table name <br>
 * Creation date: (22.2.00 12:14:08) <br>
 */
private boolean srcCreateSrcSrcRelTable(String srcSrcRelTableName) {
	if (srcCheckIfSrcSrcRelTableExist(srcSrcRelTableName))
		return true;
	String SQLStat = "CREATE TABLE " + srcSrcRelTableName + " (" + SRCConstants.sDBFieldSrcSrcRelKey + " " + SRCConstants.sDBFieldTypeBIGINT + ", " + SRCConstants.sDBFieldParSrcKey + " " + SRCConstants.sDBFieldTypeBIGINT + ", " + SRCConstants.sDBFieldChildSrcKey + " " + SRCConstants.sDBFieldTypeBIGINT + ", " + SRCConstants.sDBFieldLastChecked + " " + SRCConstants.sDBFieldTypeDATE + ")";
	boolean result;
	boolean exit = true;
	synchronized (srcSrcSrcRelTableSync) {
		int error_counter = 0;
		do {
			try {
				Statement Stmt = srcDBConn.createStatement();
				Stmt.executeQuery(SQLStat);
				Stmt.close();
				result = true;
				exit = true;
			} catch (SQLException E) {
				LogOutput.log("fail on creating srcSrcRelTable - SQLException: " + E.getMessage(), LogOutput.ERROR);
				LogOutput.flush();
				exit = !srcServeConnection();
				result = false;
				error_counter++;
			}
		} while (!exit && error_counter < 3);
	}
	return result;
}
/**
 * establish a connection with the db. <br>
 * first load the proper driver, then connect to the db <br>
 * Creation date: (12/20/99 4:03:08 AM) <br>
 * @return boolean <br>
 */
private boolean srcDBConnect() {
	int countOfTries = 3;
	boolean flag = true;
	try {
		if (srcDBConn == null || srcDBConn.isClosed()) {
			synchronized (srcDBSync) {
				for (int counter = 0; counter < countOfTries && (srcDBConn == null || srcDBConn.isClosed()); counter++) {
					try {
						srcDBConn = DriverManager.getConnection(srcConfig.sDBLocation + srcConfig.sDBName, srcConfig.sDBUser, srcConfig.sDBPass);
						LogOutput.log("db connected", LogOutput.INFO);
						LogOutput.flush();
						flag = true;
					} catch (SQLException E) {
						LogOutput.log("fail on connecting with the db - " + E.getMessage(), LogOutput.ERROR);
						LogOutput.flush();
						flag = false;
					}
				}
			}
		}
	} catch (SQLException E) {
		LogOutput.log("fail on connecting with the db - " + E.getMessage(), LogOutput.ERROR);
		LogOutput.flush();
		flag = false;
	}
	return flag;
}
/**
 * Closes the connection to the database <br>
 * Creation date: (12/20/99 4:14:19 AM) <br>
 */
private void srcDBDisConnect() {
	synchronized (srcDBSync) {
		try {
			if (srcDBConn != null)
				srcDBConn.close();
		} catch (Exception E) {
			LogOutput.log("cannot close the db - SQLException: " + E.getMessage(), LogOutput.ERROR);
		}
	}
}
/**
 * mark a source as not an active. <br>
 * Creation date: (25.1.2000 a. 22:31:38) <br>
 */
private boolean srcDeleteSrc(Src GivenSrc) {
	String SQLQuery;
	int updatedCount = 0;
	SQLQuery = "update " + SRCConstants.sDBMarketSchedSrcTable + " set " + SRCConstants.sDBFieldActive + " = 0, " + SRCConstants.sDBFieldDeactivation + " = '" + new java.sql.Date(System.currentTimeMillis()) + "' where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.schedSrcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " and " + SRCConstants.sDBFieldActive + " = 1";
	boolean result;
	boolean exit = true;
	int error_counter = 0;

	do {
		try {
			Statement Stmt = srcDBConn.createStatement();
			updatedCount = Stmt.executeUpdate(SQLQuery);
			Stmt.close();
			if (updatedCount == 1)
				result = true;
			else {
				if (updatedCount > 1) {
					LogOutput.log("fail on deleting src - more than one schedSrc deleted", LogOutput.ERROR);
					result = false;
				} else {
					LogOutput.log("fail on deleting src - no such schedSrc", LogOutput.ERROR);
					result = false;
				}
			}
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on deleting src - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			result = false;
			error_counter ++;

		}
	} while (!exit && error_counter < 3);
	return result;
}
/**
 * Changes the settings for a schedule src in the db <br>
 * Creation date: (24.2.2000 a. 22:36:59) <br>
 * @return boolean <br>
 * @param GivenSrc system.srcserver.Src <br>
 */
private boolean srcEditSchedSrc(Src GivenSrc) {
	String SQLStat;
	Statement Stmt;
	int recUpdated = 0;
	boolean result;
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Stmt = srcDBConn.createStatement();
			SQLStat = "update " + SRCConstants.sDBMarketSchedSrcTable + " set " + SRCConstants.sDBFieldTimeBase + " = " + GivenSrc.timeBase + ", " + SRCConstants.sDBFieldFrequence + " = " + GivenSrc.frequence + ", " + SRCConstants.sDBFieldKeepInPath + " = " + GivenSrc.keepInPath + ", " + SRCConstants.sDBFieldKeepInDomain + " = " + GivenSrc.keepInDomain + ", " + SRCConstants.sDBFieldGrabLevels + " = " + GivenSrc.grabLevels + ", " + SRCConstants.sDBFieldUserAgent + " = " + DBString(GivenSrc.userAgent) + " where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.schedSrcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " and " + SRCConstants.sDBFieldActive + " = 1";
			recUpdated = Stmt.executeUpdate(SQLStat);
			exit = true;
			if (recUpdated == 1) {
				result = true;
			} else {
				SQLStat = "select " + SRCConstants.sDBFieldSchedSrcKey + " from " + SRCConstants.sDBMarketSchedSrcTable + " where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.schedSrcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " and " + SRCConstants.sDBFieldActive + " = 1";
				ResultSet RS = Stmt.executeQuery(SQLStat);
				if (RS.next()) {
					result = true;
				} else {
					result = false;
				}
			}
			Stmt.close();
		} catch (SQLException E) {
			LogOutput.log("fail on editing schedSrcKey - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			result = false;
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	return result;
}
/**
 * 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 srcFormConfigParam(PrintWriter fileOut) {
	String serverName="SrcServer?";
	fileOut.println("<HTML>");
	fileOut.println("<HEAD>");
	fileOut.println("<TITLE>Param configurations of SRCServer</TITLE>");
	fileOut.println("<SCRIPT Language = \"JavaScript\">");
	fileOut.println("<!-- ");
	fileOut.println("function change(obj){");
	fileOut.println("	this.window.location = \""+ serverName + SRCConstants.sReqType + "=" + 9 + "&" + SRCConstants.sName + "=\"+obj.name+\"&value=\"+obj.paramName.value;\n}");
	fileOut.println("function b_over(){");	
	fileOut.println("	this.window.location=\"" + serverName+ SRCConstants.sReqType+ "="+ 0 + "\";\n }");
	fileOut.println("function save_to(){");	
	fileOut.println("	this.window.location = \""+ serverName + SRCConstants.sReqType + "=" + 10 + "\";\n }");	
	fileOut.println("-->");
	fileOut.println("</SCRIPT>");

	fileOut.println("</HEAD>");
	fileOut.println("<BODY  text = \"black\">");
	fileOut.println("<H3>Param configurations of SRCServer</H3><HR>");
	fileOut.println("<input type =\"button\" value=\"Overview\" onClick =\"b_over();\">");
	fileOut.println("<input type =\"button\" value=\"Save to file\" onClick =\"save_to();\">");
	fileOut.println("<HR>");
//	fileOut.println("<input type =\"hidden\" name =\"m_key\" value=\""+ srcMarketKey +"\">");
	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\">Source Server Servlet<TH>");
	fileOut.println("				</TR>");
	fileOut.println("				<TR>");
	fileOut.println("				<TD  width= 150>"+srcConfig.namesRSRServerLocation+"</TD>");	
	fileOut.println("				<FORM NAME=\""+srcConfig.namesRSRServerLocation+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ srcConfig.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>"+srcConfig.namesDBDriverLocation +"</TD>");
	fileOut.println("				<FORM NAME=\""+srcConfig.namesDBDriverLocation+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ srcConfig.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>"+srcConfig.namesDBName +"</TD>");
	fileOut.println("				<FORM NAME=\""+srcConfig.namesDBName+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ srcConfig.sDBName +"\"></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>"+srcConfig.namesDBLocation +"</TD>");
	fileOut.println("				<FORM NAME=\""+srcConfig.namesDBLocation+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ srcConfig.sDBLocation +"\"></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>"+srcConfig.namesDBUser +"</TD>");
	fileOut.println("				<FORM NAME=\""+srcConfig.namesDBUser+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ srcConfig.sDBUser+"\"></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>"+srcConfig.namesDBPass +"</TD>");
	fileOut.println("				<FORM NAME=\""+srcConfig.namesDBPass+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ srcConfig.sDBPass+"\"></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>"+srcConfig.namesLogFilePath +"</TD>");
	fileOut.println("				<FORM NAME=\""+srcConfig.namesLogFilePath+"\">");
	fileOut.println("				<TD><INPUT TYPE=\"text\" SIZE = 50 NAME=\"paramName\" value=\""+ srcConfig.sLogFilePath+"\"></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();
} // srcFormConfigPage
/**
 * Return Web page to browser. <br>
 * This page conteins Market table , and su-functions(su): <br> 
 * - Subscribe new market <br>
 * - Delete market <br>
 * - get Edit market page <br> 
 * - get Add market page <br> 
 * Creation date: (13/03/00 11:31:06 AM)
 * @param fileOut java.io.PrintWriter
 */
public void srcFormMarketSrcTab(PrintWriter fileOut, int reqMarketKey) {
	String serverName = "SrcServer?";
	int count = 0;
	int i;
	boolean exit = true;
	if (srcActiveMarkets.length == 0) { 
		return;
	}
	String SQLStat = "select " + SRCConstants.sDBFieldSrcString + ", " + SRCConstants.sDBSrcTable + "." + SRCConstants.sDBFieldSrcKey + ", " + SRCConstants.sDBFieldCheckCounts + ", " + SRCConstants.sDBFieldSchedRegDate + ", " + SRCConstants.sDBFieldSchedLastChecked + ", " + SRCConstants.sDBFieldActive  + ", " + SRCConstants.sDBFieldUserAgent + " from " + SRCConstants.sDBSrcTable + ", " + SRCConstants.sDBMarketSchedSrcTable + " where " + SRCConstants.sDBSrcTable + "." + SRCConstants.sDBFieldSrcKey + " = " + SRCConstants.sDBMarketSchedSrcTable + "." + SRCConstants.sDBFieldSchedSrcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + reqMarketKey;
	fileOut.println("<HTML>");
	fileOut.println("<HEAD>");
	fileOut.println("<TITLE>MARKET TABLE</TITLE>");
	fileOut.println("<SCRIPT Language = \"JavaScript\">");
	fileOut.println("<!-- \n     	   	  ");
	fileOut.println("function del(obj){");
	fileOut.println("	len=obj.len.value;");
	fileOut.println("	for (i=0;i<len;i++) {");
	fileOut.println("		if(obj.tab[i].checked ) { ");
	fileOut.println("			this.window.location=\"" + serverName + SRCConstants.sReqType + "=" + 61 + "&" + SRCConstants.sSchedSrcKey + "=\"+obj.tab[i].value+\"&" + SRCConstants.sMarketKey + "=" + reqMarketKey + "\";");
	fileOut.println("		}");
	fileOut.println("	}");
	fileOut.println("}");
	fileOut.println("function activ(obj){");
	fileOut.println("	len=obj.len.value;");
	fileOut.println("	for (i=0;i<len;i++) {");
	fileOut.println("		if(obj.tab[i].checked ) {");
	fileOut.println("			this.window.location=\"" + serverName + SRCConstants.sReqType + "=" + 4 + "&" + SRCConstants.sMarketKey + "=\"+obj.tab[i].value;\n ");
	fileOut.println("		}");
	fileOut.println("	}");
	fileOut.println("}");
	fileOut.println("function shw(obg){");
	fileOut.println("	this.window.location=\"" + serverName + SRCConstants.sReqType + "=" + 11 + "&" + SRCConstants.sReqMarketKey + "=\"+obg.market.value;\n}");
	fileOut.println("function b_over(){");
	fileOut.println("	this.window.location=\"" + serverName + SRCConstants.sReqType + "=" + 0 + "\";\n }");
	fileOut.println("-->");
	fileOut.println("</SCRIPT>");
	fileOut.println("</HEAD>");
	fileOut.println("<BODY  text = \"black\">");
	fileOut.println("<H3>Market Table</H3>");
	fileOut.println("<H3>Market name :&nbsp" + reqMarketKey + "</H3>");
	//	fileOut.println("<input type =\"hidden\" name =\"m_key\" value=\"" + srcMarketKey + "\">");
	fileOut.println("<FORM>");
	fileOut.println("<HR>");
	fileOut.println(" <input type=\"button\" value = \"Deactivate\" onClick = \"del(this.form);\">\n");
	fileOut.println(" <input type=\"button\" value = \"Overview\" onClick = \"b_over();\">\n");
	fileOut.println("<SELECT name=\"market\"onChange = \"shw(this.form);\" >");
	fileOut.println("	<OPTION SELECTED>Choose a market");
	for (i = 0; i < srcActiveMarkets.length; i++) {
		fileOut.println("	<OPTION value=\"" + srcActiveMarkets[i] + "\">" + srcActiveMarkets[i]);
	}
	fileOut.println("</SELECT>");
	fileOut.println("<HR>");
	fileOut.println("<TABLE border=\"1\" cellspacing=\"1\" ><TR>");
	fileOut.println("<TD bgcolor=\"#C0C0C0\"><CENTER>chek</TD>\n");
	fileOut.println("<TD bgcolor=\"#C0C0C0\"><CENTER>" + SRCConstants.sDBFieldSrcString + "</TD>\n");
	fileOut.println("<TD bgcolor=\"#C0C0C0\"><CENTER>" + SRCConstants.sDBFieldSrcKey + "</TD>\n");
	fileOut.println("<TD bgcolor=\"#C0C0C0\"><CENTER>" + SRCConstants.sDBFieldCheckCounts + "</TD>\n");
	fileOut.println("<TD bgcolor=\"#C0C0C0\"><CENTER>" + SRCConstants.sDBFieldSchedRegDate + "</TD>\n");
	fileOut.println("<TD bgcolor=\"#C0C0C0\"><CENTER>" + SRCConstants.sDBFieldSchedLastChecked + "</TD>\n");
	fileOut.println("<TD bgcolor=\"#C0C0C0\"><CENTER>" + SRCConstants.sDBFieldActive + "</TD>\n");
	fileOut.println("<TD bgcolor=\"#C0C0C0\"><CENTER>" + SRCConstants.sDBFieldUserAgent + "</TD>\n");
	fileOut.println("</TR>\n");
	Statement Stmt;
	ResultSet RS;
	int counter = 0;
	int error_counter = 0;
	do {
		try {
			// find the number of the active markets
			Stmt = srcDBConn.createStatement();
			RS = Stmt.executeQuery(SQLStat);
			while (RS.next()) {
				count++;
				fileOut.println("<TR><TD><p><INPUT TYPE=\"radio\" NAME=\"tab\" value =\"" + RS.getInt(2) + "\">");
				fileOut.println("<TD>" + RS.getString(1) + "</TD>\n");
				fileOut.println("<TD>" + RS.getInt(2) + "</TD>\n");
				fileOut.println("<TD>" + RS.getInt(3) + "</TD>\n");
				fileOut.println("<TD>" + RS.getString(4) + "</TD>\n");
				fileOut.println("<TD>" + RS.getString(5) + "</TD>\n");
				String marketStatus = "undefine";
				String m_stat = RS.getString(6);
				m_stat.trim();
				if (m_stat.equalsIgnoreCase("1")) {
					marketStatus = "true";
				} else
					if (m_stat.equalsIgnoreCase("0")) {
						marketStatus = "false";
					} else
						if (m_stat.equalsIgnoreCase("-1")) {
							marketStatus = "closed";
						}
				fileOut.println("<TD>" + marketStatus + "</TD>\n");
				fileOut.println("<TD><NOBR>" + RS.getString(7) + "</TD>\n");
				fileOut.println("</TR>");
			}
			RS.close();
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("sql exception on getting the active marktes - " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	fileOut.println(" </TABLE>\n");
	fileOut.println("<INPUT TYPE=\"HIDDEN\" NAME=\"len\" VALUE=\"" + count + "\">");
	fileOut.println(" </form>\n");
	fileOut.println("</BODY></HTML>\n");
	fileOut.close();
}
/**
 * Return Web page to browser. <br>
 * This is the Overview page . Contains links to<br>
 * Market sources<br>
 * Configuraton interface <br>
 * Re-init <br>
 * Creation date: (12/03/00 11:31:06 AM)
 * @param fileOut java.io.PrintWriter
 */
public void srcFormOverview( PrintWriter fileOut ) {

	String serverNane="SrcServer?";
	fileOut.println("<HTML>");
	fileOut.println("<HEAD>");
	fileOut.println("<TITLE>Source Server Overview</TITLE>");
	fileOut.println("<SCRIPT Language = \"JavaScript\">");
	fileOut.println("<!-- ");
	fileOut.println("function config(){");									
	fileOut.println("this.window.location = \""+ serverNane + SRCConstants.sReqType + "=" + 8 + "\"}");
	fileOut.println("function m_sourcees(){");
	fileOut.println("this.window.location = \""+ serverNane + SRCConstants.sReqType + "=" + 11 + "&" + SRCConstants.sReqMarketKey + "=" + 0 + "\"}");
	fileOut.println("function re_in(){");
	fileOut.println("this.window.location =\""+ serverNane + SRCConstants.sReqType + "=" + 12 + "\"}");
	fileOut.println("-->");
	fileOut.println("</SCRIPT>");
	fileOut.println("</HEAD>");
	fileOut.println("<BODY  text = \"black\">");
	fileOut.println("<HR><H3> Source Server Overview</H3>");
	fileOut.println("<p>ver. " + ver);
	fileOut.println("<HR>");
//	fileOut.println("<input type =\"hidden\" name =\"m_key\" value=\""+ srcMarketKey +"\">");
	fileOut.println("<FORM name=\"logs\">");
	fileOut.println("<input type=\"button\" value=\"Market sources\" onClick=\"m_sourcees();\">");
	fileOut.println("<input type=\"button\" value=\"Configurations\" onClick=\"config();\">");
	fileOut.println("<input type=\"button\" value=\"Re_Init\"onClick=\"re_in();\">");
	fileOut.println("</FORM>");
	fileOut.println("</BODY></HTML>\n");
	fileOut.close();
} // rsrFormOverview
/**
 * 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 srcGetActiveMarkets() throws ServletException, IOException {
	// the ResourceServer address is taken from the Constants class
	String CommString = SRCConstants.sRSRReqType + "=" + SRCConstants.sRSRReqTypeValue;
	String marketList = "";
	StreamTokenizer stoken;
	InputStream in;
	try {
		URL ServletURL = new URL(srcConfig.sRSRServerLocation + CommString);
		in = ServletURL.openStream();
		stoken = new StreamTokenizer(new BufferedReader(new InputStreamReader(in)));
	} catch (IOException e) {
		LogOutput.log("Error connecting to ResourceServer | " + e.getMessage(), LogOutput.ERROR);
		return false;
	}
	stoken.whitespaceChars((int) SRCConstants.cInputSeparator, (int) SRCConstants.cInputSeparator);
	try {
		if (stoken.nextToken() != stoken.TT_NUMBER)
			return false;
		int numOfValidMarkets = (int) stoken.nval;
		if (numOfValidMarkets == 0) {
			LogOutput.log("fail on getting active markets - zaro market keys", LogOutput.ERROR);
			return false;
		}
		srcActiveMarkets = new int[numOfValidMarkets];
		for (int counter = 0; counter < numOfValidMarkets; counter++) {
			if (stoken.nextToken() != stoken.TT_NUMBER) {
				in.close();
				LogOutput.log("fail on getting active markets - not a numeric value", LogOutput.ERROR);
				return false;
			}
			srcActiveMarkets[counter] = (int) stoken.nval;
		}
	} catch (Exception e) {
		LogOutput.log("fail on getting active markets - " + e.getMessage(), LogOutput.ERROR);
		in.close();
		return false;
	}
	in.close();
	return true;
}
/**
 * gets a list with sources used by a market. <br>
 * test version <br>
 * Creation date: (13.3.2000 a. 15:46:45) <br>
 */
public void srcGetMarketSrcTab() {
	int reqMarketKey = 2;
	String SQLStat = "select " + SRCConstants.sDBFieldSrcString + ", " + SRCConstants.sDBSrcTable + "." + SRCConstants.sDBFieldSrcKey + ", " + SRCConstants.sDBFieldCheckCounts + ", " + SRCConstants.sDBFieldSchedRegDate + ", " + SRCConstants.sDBFieldSchedLastChecked + " from " + SRCConstants.sDBSrcTable + ", " + SRCConstants.sDBMarketSchedSrcTable + " where " + SRCConstants.sDBSrcTable + "." + SRCConstants.sDBFieldSrcKey + " = " + SRCConstants.sDBMarketSchedSrcTable + "." + SRCConstants.sDBFieldSchedSrcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + reqMarketKey;
	Statement Stmt;
	ResultSet RS;
	int counter = 0;
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			// find the number of the active markets
			Stmt = srcDBConn.createStatement();
			RS = Stmt.executeQuery(SQLStat);
			while (RS.next()) {
				System.out.println(RS.getString(1)); // srcstring
				System.out.println(RS.getInt(2)); // srckey
				System.out.println(RS.getInt(3)); // checkcounts
				System.out.println(RS.getString(4)); // regdate
				System.out.println(RS.getString(5)); // lastcheck date
				System.out.println();
			}
			RS.close();
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("sql exception on getting the active marktes - " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			error_counter ++;
		}
	} while (!exit && error_counter < 3);
}
/**
 * find a proper (unused) value for a srcKey for a new record in the src table <br>
 * Creation date: (12/22/99 5:17:03 PM) <br>
 * @return int <br>
 */
private long srcGetNewSrcKey() {
	String SQLQuery;
	long srcKey = 0;
	SQLQuery = "select " + SRCConstants.sDBFieldSrcKey + " from " + SRCConstants.sDBSrcTable;
	boolean exit = true;
	synchronized (srcSrcSync) {
		int error_counter = 0;
		do {
			try {
				Statement Stmt = srcDBConn.createStatement();
				ResultSet RS = Stmt.executeQuery(SQLQuery);
				while (RS.next()) {
					if (srcKey < RS.getLong(1)) {
						srcKey = RS.getLong(1);
					}
				}
				srcKey++;
				RS.close();
				Stmt.close();
				exit = true;
			} catch (SQLException E) {
				LogOutput.log("fail on getting new srcKey" + E.getMessage(), LogOutput.ERROR);
				LogOutput.flush();
				exit = !srcServeConnection();
				srcKey = 0;
				error_counter++;
			}
		} while (!exit && error_counter < 3);
	}
	return srcKey;
}
/**
 * goes through the SrcSrcRel table and compose a valid value for <br>
 * a new srcSrcRelKey. the value of the key is a sum of a table unique <br>
 * key multiplied by 10 and the last digit of the parSrcKey: <br>
 * newSrcSrcRelKey = (MAX(srcSrcRelKey)/10 + 1)*10 + LASTDIGIT(parSrcKey) <br>
 * Creation date: (22.2.00 14:33:02) <br>
 * @return long - value of a not-existing value key <br>
 */
private long srcGetNewSrcSrcRelKey(long parSrcKey, String srcSrcRelTableName) {
	String SQLStat;
	long srcSrcRelKey = 0;
	SQLStat = "select " + SRCConstants.sDBFieldSrcSrcRelKey + " from " + srcSrcRelTableName;
	boolean exit = true;
	synchronized (srcSrcSrcRelTableSync) {
		int error_counter = 0;
		do {
			try {
				Statement Stmt = srcDBConn.createStatement();
				ResultSet RS = Stmt.executeQuery(SQLStat);
				while (RS.next()) {
					if (srcSrcRelKey < RS.getLong(1)) {
						srcSrcRelKey = RS.getLong(1);
					}
				}
				srcSrcRelKey = (srcSrcRelKey / 10 + 1) * 10 + parSrcKey % 10;
				RS.close();
				Stmt.close();
				exit = true;
			} catch (SQLException E) {
				LogOutput.log("fail on getting new srcSrcRel Key " + E.getMessage(), LogOutput.ERROR);
				LogOutput.flush();
				exit = !srcServeConnection();
				srcSrcRelKey = 0;
				error_counter++;
			}
		} while (!exit && error_counter < 3);
		return srcSrcRelKey;
	}
}
/**			 
 * executes all the routines that are needed for the initializing of the servlet <br>
 * Creation date: (17.3.2000 a. 15:14:39) <br>
 */
private void srcInit() {   
	srcConfig = new ConfigSrcServer();
	String tempCfgPath = getInitParameter(SRCConstants.sCfgPath);
	if (tempCfgPath != null)
		srcConfig.sSrcCfgPath = tempCfgPath;
	srcConfig.cfgLoadProperty(srcConfig.sSrcCfgPath);
	LogOutput = LogPrinter.makeLogPrinter(srcConfig.sLogFilePath);
	if (LogOutput == null) {
		return;
		// must deny all the requests
	}
	LogOutput.setLogLevel(LogPrinter.ALL);
	LogOutput.setScreenLogLevel(LogPrinter.ALL);
	srcLoadDriver();
	srcDBConnect();
	LogOutput.log("Init Servlet", LogOutput.INFO);
	LogOutput.flush();
}
/**
 * Loads the db driver <br>
 * it must be executed before trying to establish a connection with the db <br>
 * Creation date: (4/25/00 7:53:23 PM) <br>
 * @return boolean <br>
 */
private boolean srcLoadDriver() {
	// load the driver
	try {
		Class.forName(srcConfig.sDBDriverLocation).newInstance();
		return true;
	} catch (Exception E) {
		LogOutput.log("fail on loading dbDriver " + E, LogOutput.ERROR);
		LogOutput.flush();
		return false;
	}
}
/**
 * Loads info about a schedSrc from the DB into a Src object.
 * Creation date: (30.8.00 15:04:11)
 * @return boolean
 * @param GivenSrc system.srcserver.Src
 */
public Src srcLoadSchedSrc(Src GivenSrc) {
	String SQLQuery;
	SQLQuery = "select " + SRCConstants.sDBFieldCheckCounts + ", " + SRCConstants.sDBFieldAvgProcTime + " from " + SRCConstants.sDBMarketSchedSrcTable + " where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.schedSrcKey + " AND " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " AND " + SRCConstants.sDBFieldActive + " = 1";
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Statement Stmt = srcDBConn.createStatement();
			ResultSet RS = Stmt.executeQuery(SQLQuery);
			if (RS.next()) {
				// more values must be added here
				GivenSrc.checkCounts = RS.getInt(1);
				GivenSrc.avgProcTime = RS.getInt(2);
			}
			RS.close();
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on loading source - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			GivenSrc = null;
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	return GivenSrc;
}
/**
 * fill a Src object with given srcKey <br>
 * Creation date: (12/22/99 5:06:22 PM) <br>
 * @return srcserver.Src <br>
 * @param srcKey int <br>
 */
private Src srcLoadSource(Src GivenSrc) {
	String SQLQuery;
	SQLQuery = "select " + SRCConstants.sDBFieldSrcString + ", " + SRCConstants.sDBFieldLangKey + " from " + SRCConstants.sDBSrcTable + " where " + SRCConstants.sDBFieldSrcKey + " = " + String.valueOf(GivenSrc.srcKey);
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Statement Stmt = srcDBConn.createStatement();
			ResultSet RS = Stmt.executeQuery(SQLQuery);
			while (RS.next()) {
				// more values must be added here
				GivenSrc.srcString = RS.getString(1);
				GivenSrc.langKey = RS.getInt(2);
			}
			RS.close();
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on loading source - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			GivenSrc = null;
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	return GivenSrc;
}
/**
 * insert a Src object in the src table with a free key <br>
 * Creation date: (12/22/99 4:44:54 AM) <br>
 * @return srcserver.Src <br>
 */
private long srcRegisterSource(Src GivenSrc) {
	long SrcKey = -1;
	String SQLStat;
	SrcKey = srcGetNewSrcKey();
	SQLStat = "INSERT INTO " + SRCConstants.sDBSrcTable + " (" + SRCConstants.sDBFieldSrcKey + ", " + SRCConstants.sDBFieldLangKey + ", " + SRCConstants.sDBFieldSrcString + ", " + SRCConstants.sDBFieldSrcTitle + ", " + SRCConstants.sDBFieldSrcCounts + ", " + SRCConstants.sDBFieldSrcRegDate + ") " + "values (" + SrcKey + ", " + GivenSrc.langKey + ", " + DBString(GivenSrc.srcString) + ", " + DBString(GivenSrc.srcTitle) + ", 0, '" + new java.sql.Date(System.currentTimeMillis()) + "')";
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Statement Stmt = srcDBConn.createStatement();
			Stmt.executeQuery(SQLStat);
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on registring source - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			SrcKey = 0;
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	return SrcKey;
}
/**
 * Resolve source to market relation <br>
 * for submiting srcs through the ResourceServer <br>
 * check if such relation exist <br>
 * if exist, update TimeBase, Frequence and KeepInPath fields <br>
 * if not - register it <br>
 * Creation date: (12/23/99 11:05:49 PM) <br>
 */
private boolean srcResolveIntRel(Src GivenSrc) {
	String SQLStat;
	ResultSet RS = null;
	Statement Stmt;
	SQLStat = "select " + SRCConstants.sDBFieldTimeBase + ", " + SRCConstants.sDBFieldFrequence + ", " + SRCConstants.sDBFieldKeepInPath + ", " + SRCConstants.sDBFieldKeepInDomain + ", " + SRCConstants.sDBFieldGrabLevels + ", " + SRCConstants.sDBFieldUserAgent + " from " + SRCConstants.sDBMarketSchedSrcTable + " where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.srcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " and " + SRCConstants.sDBFieldActive + " = 1";
	boolean result;
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Stmt = srcDBConn.createStatement();
			RS = Stmt.executeQuery(SQLStat);
			Stmt.close();
			if (RS.next()) {
				if (RS.getInt(1) != GivenSrc.timeBase || RS.getInt(2) != GivenSrc.frequence || RS.getInt(3) != GivenSrc.keepInPath || RS.getInt(4) != GivenSrc.keepInDomain || RS.getInt(5) != GivenSrc.grabLevels || !RS.getString(6).equals(GivenSrc.userAgent)) {
					SQLStat = "update " + SRCConstants.sDBMarketSchedSrcTable + " set " + SRCConstants.sDBFieldTimeBase + " = " + GivenSrc.timeBase + ", " + SRCConstants.sDBFieldFrequence + " = " + GivenSrc.frequence + ", " + SRCConstants.sDBFieldKeepInPath + " = " + GivenSrc.keepInPath + ", " + SRCConstants.sDBFieldKeepInDomain + " = " + GivenSrc.keepInDomain + ", " + SRCConstants.sDBFieldGrabLevels + " = " + GivenSrc.grabLevels + ", " + SRCConstants.sDBFieldUserAgent + " = " + DBString(GivenSrc.userAgent) + ", " + SRCConstants.sDBFieldSchedActive + " = " + GivenSrc.schedActive + " where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.srcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " and " + SRCConstants.sDBFieldActive + " = 1";
					Stmt = srcDBConn.createStatement();
					Stmt.execute(SQLStat);
					Stmt.close();
				}
			} else {
				SQLStat = "insert into  " + SRCConstants.sDBMarketSchedSrcTable + " (" + SRCConstants.sDBFieldSchedSrcKey + ", " + SRCConstants.sDBFieldMarketKey + ", " + SRCConstants.sDBFieldCheckCounts + ", " + SRCConstants.sDBFieldSchedRegDate + ", " + SRCConstants.sDBFieldTimeBase + ", " + SRCConstants.sDBFieldFrequence + ", " + SRCConstants.sDBFieldKeepInPath + ", " + SRCConstants.sDBFieldKeepInDomain + ", " + SRCConstants.sDBFieldGrabLevels + ", " + SRCConstants.sDBFieldActive + ", " + SRCConstants.sDBFieldUserAgent + ", " + SRCConstants.sDBFieldSchedActive + ") values (" + GivenSrc.srcKey + ", " + GivenSrc.marketKey + ", " + GivenSrc.checkCounts + ", '" + new java.sql.Date(System.currentTimeMillis()) + "', " + GivenSrc.timeBase + ", " + GivenSrc.frequence + ", " + GivenSrc.keepInPath + ", " + GivenSrc.keepInDomain + ", " + GivenSrc.grabLevels + ", 1, " + DBString(GivenSrc.userAgent) + ", " + GivenSrc.schedActive + ")";
				Stmt = srcDBConn.createStatement();
				Stmt.executeQuery(SQLStat);
				Stmt.close();
			}
			exit = true;
			result = true;
		} catch (SQLException E) {
			LogOutput.log("fail on resolving intRel - sqlStat : " + SQLStat + " | SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			result = false;
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	return result;
}
/**
 * finds a srcKey with given src info, otherwise return -1 for srcKey <br>
 * Creation date: (12/22/99 4:44:23 AM) <br>
 * @return srcserver.Src <br>
 */
private Src srcResolveString(Src GivenSrc) {
	long srcKey = srcStringToKey(GivenSrc);
	if (srcKey < 0) srcKey = srcRegisterSource(GivenSrc);
	GivenSrc.srcKey = srcKey;
	return GivenSrc;
}
/**
 * Saves the cfg file <br>
 * Creation date: (07.3.2000 a. 16:38:17) <br>
 * @param req HttpServletRequest <br>
 */
public void srcSaveCfgFile() {
	srcConfig.cfgSaveProperty( srcConfig.sSrcCfgPath );
}
/**
 * checks what is the state of the db connection and restores/establish it if needed <br>
 * Creation date: (4/24/00 6:01:24 PM) <br>
 * @return boolean <br>
 */
private boolean srcServeConnection() {
	// got to synchronize this
	if (!srcCheckConnection()) {
		if (!srcDBConnect()) {
			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;
	}
}
/**
 * serve the count process for the market's base sources relations <br>
 * Creation date: (12/24/99 2:36:15 PM) <br>
 * @param GivenSrc srcserver.Src <br>
 */
private boolean srcServeSchedCountRel(Src GivenSrc) {
	String SQLStat;
	Statement Stmt;
	SQLStat = "update " + SRCConstants.sDBSrcTable + " set " + SRCConstants.sDBFieldSrcCounts + " = " + SRCConstants.sDBFieldSrcCounts + " + 1, " + SRCConstants.sDBFieldSrcLastChecked + " = '" + new java.sql.Date(System.currentTimeMillis()) + "', " + SRCConstants.sDBFieldSrcTitle + " = " + DBString(GivenSrc.srcTitle) + " where " + SRCConstants.sDBFieldSrcKey + "= " + GivenSrc.srcKey;
	boolean result;
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Stmt = srcDBConn.createStatement();
			Stmt.executeUpdate(SQLStat);
			Stmt.close();
			SQLStat = "update " + SRCConstants.sDBMarketSchedSrcTable + " set " + SRCConstants.sDBFieldCheckCounts + " = " + SRCConstants.sDBFieldCheckCounts + " + 1, " + SRCConstants.sDBFieldSchedLastChecked + " = '" + new java.sql.Date(System.currentTimeMillis()) + "' where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.srcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey;
			Stmt = srcDBConn.createStatement();
			Stmt.executeUpdate(SQLStat);
			Stmt.close();
			result = true;
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on serving schedCountRel - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			result = false;
			error_counter ++;
		}
	} while (!exit && error_counter < 3);
	return result;
}
/**
 * makes the required updates/inserts in the db to register that a current src was checked
 * Creation date: (12/23/99 1:22:13 PM)
 * @param GivenSrc srcserver.Src
 */
private boolean srcServeSrcCountRel(Src GivenSrc) {
	String SQLStat;
	int ResCount = 0;
	Statement Stmt;
	SQLStat = "update " + SRCConstants.sDBSrcTable + " set " + SRCConstants.sDBFieldSrcCounts + " = " + SRCConstants.sDBFieldSrcCounts + " + 1, " + SRCConstants.sDBFieldSrcLastChecked + " = '" + new java.sql.Date(System.currentTimeMillis()) + "', " + SRCConstants.sDBFieldSrcTitle + " = " + DBString(GivenSrc.srcTitle) + " where " + SRCConstants.sDBFieldSrcKey + " = " + GivenSrc.srcKey;
	boolean result;
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Stmt = srcDBConn.createStatement();
			ResCount = Stmt.executeUpdate(SQLStat);
			Stmt.close();
			SQLStat = "update " + SRCConstants.sDBMarketSrcRelTable + " set " + SRCConstants.sDBFieldMarketSrcCheckCounts + " = " + SRCConstants.sDBFieldMarketSrcCheckCounts + " + 1, " + SRCConstants.sDBFieldMarketSrcLastChecked + " = '" + new java.sql.Date(System.currentTimeMillis()) + "' where " + SRCConstants.sDBFieldSrcKey + " = " + GivenSrc.srcKey + " and " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.schedSrcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey;
			Stmt = srcDBConn.createStatement();
			ResCount = Stmt.executeUpdate(SQLStat);
			Stmt.close();
			if (ResCount == 0) {
				SQLStat = "insert into " + SRCConstants.sDBMarketSrcRelTable + " (" + SRCConstants.sDBFieldSrcKey + ", " + SRCConstants.sDBFieldSchedSrcKey + ", " + SRCConstants.sDBFieldMarketKey + ", " + SRCConstants.sDBFieldMarketSrcCheckCounts + ", " + SRCConstants.sDBFieldMarketSrcRegDate + ", " + SRCConstants.sDBFieldMarketSrcLastChecked + ") values (" + GivenSrc.srcKey + ", " + GivenSrc.schedSrcKey + ", " + GivenSrc.marketKey + ", 1, '" + new java.sql.Date(System.currentTimeMillis()) + "', '" + new java.sql.Date(System.currentTimeMillis()) + "')";
				Stmt = srcDBConn.createStatement();
				Stmt.executeUpdate(SQLStat);
				Stmt.close();
			}
			exit = true;
			result = true;
		} catch (SQLException E) {
			LogOutput.log("fail on serving srcCountRel on query - " + SQLStat + " - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			result = false;
			error_counter ++;
		}
	} while (!exit && error_counter < 3);
	return result;
}
/**
 * Insert the method's description here.
 * Creation date: (13.7.00 10:11:13)
 * @return boolean
 * @param GivenSrc system.srcserver.Src
 */
private boolean srcSetSchedActive(Src GivenSrc) {
	boolean result;
	boolean exit;
	if (!srcCheckSchedSrc(GivenSrc)) {
		LogOutput.log("an attemp to activate/deactivate schedSrc with a not sched src", LogOutput.ERROR);
		LogOutput.flush();
		result = false;
	} else {
		int error_counter = 0;
		do {
			String SQLStat = "update " + SRCConstants.sDBMarketSchedSrcTable + " set " + SRCConstants.sDBFieldSchedActive + " = " + GivenSrc.schedActive + " where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.schedSrcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " and " + SRCConstants.sDBFieldActive + " = 1";
			try {
				Statement Stmt = srcDBConn.createStatement();
				if (Stmt.executeUpdate(SQLStat) == 0) {
					SQLStat = "select " + SRCConstants.sDBFieldSchedSrcKey + " from " + SRCConstants.sDBMarketSchedSrcTable + " where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.schedSrcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " and " + SRCConstants.sDBFieldActive + " = 1 and " + SRCConstants.sDBFieldSchedActive + " = " + GivenSrc.schedActive;
					ResultSet RS = Stmt.executeQuery(SQLStat);
					if (RS.next())
						result = true;
					else {
						LogOutput.log("an attemp to activate/deactivate schedSrc but the schedSrc not found in the db - sqlStat : " + SQLStat, LogOutput.ERROR);
						LogOutput.flush();
						result = false;
					}
				} else
					result = true;
				Stmt.close();
				exit = true;
			} catch (SQLException E) {
				LogOutput.log("fail on sched activate/deactivate schedSrc - SQLException: " + E + " sqlStat - " + SQLStat, LogOutput.ERROR);
				LogOutput.flush();
				exit = !srcServeConnection();
				result = false;
				error_counter++;
			}
		} while (!exit && error_counter < 3);
	}
	return result;
}
/**
 * control the parent-to-child source relation solvation <br>
 * Creation date: (22.2.2000 a. 01:56:14) <br>
 * @param GivenSrc system.srcserver.Src <br>
 */
private void srcSolveSrcSrcRel(Src GivenSrc) {
	// find the proper table
	String srcSrcRelTableName = SRCConstants.sDBSrcSrcRelTableBase + GivenSrc.parSrcKey%10;
	if (!srcCheckIfSrcSrcRelTableExist(srcSrcRelTableName)) {
		srcCreateSrcSrcRelTable(srcSrcRelTableName);
	}
	// clear the fields that are for the same parSrcKey and are not checked today
	srcClearOldSrcSrcRelRecords(GivenSrc, srcSrcRelTableName);
	// add the new relation
	srcAddSrcSrcRel(GivenSrc, srcSrcRelTableName);
}
/**
 * finds a srcKey with given Src object. if not found, return 0 <br>
 * Creation date: (12/22/99 6:43:32 PM) <br>
 * @return int <br>
 * @param GivenSrc srcserver.Src <br>
 */
private long srcStringToKey(Src GivenSrc) {
	String SQLStat;
	long srcKey = -1;
	SQLStat = "select " + SRCConstants.sDBFieldSrcKey + " from " + SRCConstants.sDBSrcTable + " where " + SRCConstants.sDBFieldSrcString + " = " + DBString(GivenSrc.srcString) + " and " + SRCConstants.sDBFieldLangKey + " = " + GivenSrc.langKey;
	boolean exit = true;
	int error_counter = 0;
	do {
		try {
			Statement Stmt = srcDBConn.createStatement();
			ResultSet RS = Stmt.executeQuery(SQLStat);
			while (RS.next()) {
				srcKey = RS.getLong(1);
			}
			RS.close();
			Stmt.close();
			exit = true;
		} catch (SQLException E) {
			LogOutput.log("fail on converting stringToKey - SQLException: " + E.getMessage(), LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			srcKey = 0;
			error_counter ++;
		}
	} while (!exit && error_counter < 3);
	return srcKey;
}
/**
 * Insert the method's description here.
 * Creation date: (1.8.00 12:58:42)
 * @return boolean
 * @param GivenSrc system.srcserver.Src
 */
private boolean srcUpdateSchedSrcStats(Src GivenSrc) {
	String SQLStat;
	Statement Stmt;
	boolean result;
	boolean exit = true;
	int error_counter = 0;
	if (GivenSrc.checkCounts != 0)
		GivenSrc.avgProcTime = (GivenSrc.avgProcTime * (GivenSrc.checkCounts - 1) + GivenSrc.lastProcTime) / (GivenSrc.checkCounts);
	else
		GivenSrc.avgProcTime = GivenSrc.lastProcTime;
	SQLStat = "update " + SRCConstants.sDBMarketSchedSrcTable + " set " + SRCConstants.sDBFieldLastProcTime + " = " + GivenSrc.lastProcTime + ", " + SRCConstants.sDBFieldAvgProcTime + " = " + GivenSrc.avgProcTime + ", " + SRCConstants.sDBFieldNumSrc + " = " + GivenSrc.numSrc + " where " + SRCConstants.sDBFieldSchedSrcKey + " = " + GivenSrc.schedSrcKey + " and " + SRCConstants.sDBFieldMarketKey + " = " + GivenSrc.marketKey + " and " + SRCConstants.sDBFieldActive + " = 1";
	do {
		try {
			Stmt = srcDBConn.createStatement();
			Stmt.executeUpdate(SQLStat);
			Stmt.close();
			exit = true;
			result = true;
		} catch (SQLException E) {
			LogOutput.log("fail on updating schedSrc stat - SQLException: " + E.getMessage() + " on sql query " + SQLStat, LogOutput.ERROR);
			LogOutput.flush();
			exit = !srcServeConnection();
			result = false;
			error_counter++;
		}
	} while (!exit && error_counter < 3);
	return result;
}
}

