package market.thread;

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

/**
 * Netrunner is thread which scan BaseSrcKey and it subLevel 
 * Creation date: (12/23/99 6:22:36 PM)
 * @author: tin
 */
public class Netrunner extends Thread {
// Field
	private ThreadGroup threadGroup;
	public java.util.Vector downloaded;
	public LangTable langTable; // This is a table whit Language
	public  boolean working;
	public SrcElement baseSrcElem;
	
	private Queue linkInStream;
	private Queue srcSwapOutStream;
	private	Queue srcOutStream;

// Thread

	public Downloader mDownloader;
	public Parser mParser;
	public Swapper mSwapper;
	public TextSplitter mTextSplitter;

	public Queue htmlInStream;
	public int netNum;
	public int numSubSrc;
/**
 * NetrunnerThread constructor comment.
 */
public Netrunner() {
	super();
}
/**
 * NetrunnerThread constructor comment.
 * @param num int ( Netrunner number )
 * @param threadGroup ThreadGroup 
 * @param baseSrcElem market.util.SrcElement 
 * @param langTable LangTable
 */
public Netrunner( int num, ThreadGroup tGroup, SrcElement baseSrcElem, LangTable langTable ) {
	super( tGroup, "Netrunner"+num);
	netNum = num;
	threadGroup = tGroup;
	this.langTable = langTable;
	this.baseSrcElem = baseSrcElem;
	downloaded = new Vector( Const.MAX_DOWNLOADED, Const.RISE_DOWNLOADED );
}
/**
 * Insert the method's description here.
 * Creation date: (12/25/99 6:37:09 PM)
 * @return market.util.LinkElement
 * @param SrcElem market.util.SrcElement
 */
public LinkElement getLink(SrcElement SrcElem) {
	
	return null;
}
public void init() throws IOException, StreamCorruptedException {

// Src chenal set 	
	srcOutStream =  new Queue( ConfigMarket.NETRUNNER_OUT );
	
	srcSwapOutStream = new Queue( ConfigMarket.NETRUNNER_OUT );
		
	initURLGrabberGroupe();
// end Src chenal set   
	
	
}
/**
 * Init URLGrabber groupe. 
 * 1. Init Downloader
 * 2. Init Parser
 * 3. Init TextSpliter 
 * Creation date: (1/2/00 10:30:16 PM)
 */
private void initURLGrabberGroupe() {

// 1. Init Downloader
   try{  
		mDownloader = new Downloader( netNum, threadGroup ,srcSwapOutStream, langTable, baseSrcElem );
		mDownloader.setPriority( Const.DOWNLOADER_PRIORITY);

   }catch( Exception e){
		ConfigMarket.logWriter.log( getName()+": Can't create Downloader!!!", LogPrinter.ERROR);
   }
   
// 2. Init Parser
   try{
	    htmlInStream = mDownloader.getHtmlInPipe();
		mParser = new Parser( netNum, threadGroup , htmlInStream, baseSrcElem );
		mParser.setPriority( Const.PARSER_PRIORITY);
	    linkInStream = mParser.getLinkInPipe();
   }catch( Exception e){
  		ConfigMarket.logWriter.log( getName()+": Can't create Parser!!!", LogPrinter.ERROR);
   }

// 3. Init Swapper
   try{
		mSwapper = new Swapper( netNum, threadGroup , srcOutStream, srcSwapOutStream );
		mSwapper.setPriority( Const.PARSER_PRIORITY);
   }catch( Exception e){
  		ConfigMarket.logWriter.log( getName()+": Can't create Swapper!!!", LogPrinter.ERROR);
   }

// 4. Init TextSpliter
   try{  
		mTextSplitter = new TextSplitter( netNum, threadGroup ,mParser.getTextInPipe(), ConfigMarket.number_WrProcessor );
		mTextSplitter.setPriority( Const.TEXT_SPLITTER_PRIORITY);
   }catch( Exception e){
		ConfigMarket.logWriter.log( getName()+": Can't create TextSplitter!!!", LogPrinter.ERROR);
   }
		
}
/**
 * Kill Netrunner and all our slave.
 * Creation date: (03.3.2000 “. 04:34:59)
 */
public void kill() {
	
// Kill Downloader, Parser and TextSpliter
	mDownloader.stop();
	mParser.stop();
	mTextSplitter.kill();
	
	stop();
}
/**
 * Insert the method's description here.
 * Creation date: (1/8/00 11:20:20 AM)
 */
public static void main(String[] args) {

//	ConfigMarket.init("k:\\market\\market.cfg");
//	ConfigMarket.init("d:\\testmarket\\cfg_sr\\market.cfg");
	boolean r = sendFinishSrcAccount( 100 , 472, 3021, 380 );
	System.out.println( r );
		
//	  ConfigMarket.rwServer = new market_Servlets.market_rwServer();
//	  ConfigMarket.rwServer.market_rwServerInit();
//	  ConfigMarket.rwServer.market_rwSetMarketKey( market.ConfigMarket.marketKey );

//	  ConfigMarket.wrServer = new market_Servlets.market_wrServer();
//	  ConfigMarket.wrServer.market_wrServerInit();
//	  ConfigMarket.wrServer.market_wrSetMarketKey( market.ConfigMarket.marketKey );

	System.out.println( ResolveSrcKey( 223 ) );
	
	ConfigMarket.mDocsCacher = new DocsCacher();
	ConfigMarket.mDocsCacher.loadCache();
	
	//SrcElement(String srcValue,int srcKey, int langKey, int timeBase, int frequence, boolean KeepInPath, int GrabLevel)
//	SrcElement src = new SrcElement( "http://www.yahoo.com/", 53, 1, 120 , 2, true, 2);
//	SrcElement src = new SrcElement( "http://www.market.esof/market1.html", 46, 1, 120 , 2, true, 4);
//	SrcElement src = new SrcElement( "http://www.market.esof/frame.htm", 91, 1, 120 , 2, true, true, 0);
	SrcElement src = new SrcElement( "http://www.market.esof/index.html", 223, 1, 120 , 2, true, true, 0,"Java.1.1.8");
		
	Netrunner mNetrunner = new Netrunner( 1, null, src, null );
	try{
		mNetrunner.init(); // Init Netrunner
	}
	catch( Exception e ){
		System.out.println(" Can't init Netrunner!!");
		return;
	}	
	mNetrunner.start();
		
}
/**
 * Get SrcString from SourceServer
 * Creation date: (12/25/99 7:23:37 PM)
 * @return String
 * @param srcKey long
 */
public static String ResolveSrcKey( long srcKey ){

	StringBuffer ret_srcValue = new StringBuffer( Const.MAX_LEN_URL );

	try{
		
	  URL ServletURL = new URL( ConfigMarket.hostSourceServer +"?"+ Const.REQ_TYPE +"="+ Const.RESOLV_SRC+ 
		  "&" + Const.SRC_KEY +"="+ srcKey +
		  "&" + Const.MARKET_KEY +"="+ ConfigMarket.marketKey ); 

	  InputStream in = ServletURL.openStream();
	  
	  int b; 
	
 	  while ((b =in.read())!= -1){ 
	 	  ret_srcValue.append((char)b);  
	  } 
 
	  return ret_srcValue.toString();

	}
	catch(IOException e){
  		ConfigMarket.logWriter.log("NetrunnerX: Can't resolve Src Key: "+srcKey+"!", LogPrinter.ERROR);
		e.printStackTrace(ConfigMarket.logWriter.getPrintWriter());
		return null;
	}
	
}
/**
 * Body cicle of Netrunner
 * Creation date: (12/23/99 6:50:58 PM)
 */
public void run() {
	LinkElement curLink;
	try {
		ConfigMarket.logWriter.log(getName() + ": Start URLGraberGroupe.", LogPrinter.INFO);
		startURLGrabberGroupe();
		//  SrcElement src = srcList.getNext(); 
		ConfigMarket.logWriter.log(getName() + ": Weak up", LogPrinter.DEBUG_2);
		working = true; //Up flag that Working
		// get BaseSrcKey SetBasePath
		baseSrcElem.srcString = ResolveSrcKey(baseSrcElem.srcKey);
		if ( null != baseSrcElem.srcString ){ 
			curLink = new LinkElement(baseSrcElem.srcKey, baseSrcElem.langKey, baseSrcElem.srcString, baseSrcElem.grabLevels, baseSrcElem.srcKey);
			working = true;
		}else{
			working = false;
			srcOutStream.writeObject(null); // Set For Download mesage for End
			ConfigMarket.logWriter.log(getName() + ": Not properly Finish! ", LogPrinter.ERROR);
			return;
		}
		
		first : while (working) {
			ConfigMarket.logWriter.log(getName() + ": Next link to grab is " + curLink.srcString + " GrabLevel= " + curLink.grabLevel, LogPrinter.DEBUG);
			try {
				downloaded.addElement(curLink.srcString); // !!!! Put In Downloaded List
				srcOutStream.writeObject(curLink); // Set For Download
				ConfigMarket.logWriter.log(getName() + ": Sended. Num of Element:" + srcOutStream.getNumOfElement(), LogPrinter.DEBUG);
			} catch (Exception e) {
				ConfigMarket.logWriter.log(getName() + ": Can't write in src Stream ", LogPrinter.ERROR);
			}
			
			ConfigMarket.logWriter.log(getName() + ": Reading Link Element...:" , LogPrinter.DEBUG);
			second : do {
				try {
					while (linkInStream.isEmpty()) {
						if (srcOutStream.isWait() && srcSwapOutStream.isWait() && htmlInStream.isWait() && linkInStream.isEmpty()) {
							working = false;
							ConfigMarket.logWriter.log(getName() + ": Finish link=" + linkInStream.getNumOfElement() + " html=" + htmlInStream.getNumOfElement() + " src=" + srcOutStream.getNumOfElement(), LogPrinter.DEBUG);
							continue first;
						}
						sleep(Const.NETRUNNER_TIME_SLEEP);
					}
					yield();
					curLink = (LinkElement) linkInStream.readObject(); // get Next Link from Parser

				} catch (Exception e) {
					ConfigMarket.logWriter.log(getName() + ": Empty link Stream!", LogPrinter.ERROR);
					working = false;
					continue;
				}
			// Check grabLevel and is already downloaded	
			} while ((--curLink.grabLevel < 0) || (downloaded.contains(curLink.srcString)));

			ConfigMarket.logWriter.log(getName() + ": Resolving Src String = " + curLink.srcString , LogPrinter.DEBUG);
			// First resolve srcString, after download (Downloader) and next count (Parser)
			curLink.srcKey = srcResolveString(curLink.srcString, baseSrcElem.langKey, baseSrcElem.srcKey, ConfigMarket.marketKey); // srcResolveValue

			if (0 >= curLink.srcKey) { // Can't resolve srcString exit !!!
				ConfigMarket.logWriter.log(getName() + ":Unacceptable srcKey:" + curLink.srcKey + " ! Stopping...", LogPrinter.ERROR);
				working = false;
				continue;
			}
			yield();
		}
	} catch (ThreadDeath t) {
		ConfigMarket.logWriter.log(getName() + ": Force stop (kill):", LogPrinter.ERROR);
		t.printStackTrace(ConfigMarket.logWriter.getPrintWriter());
	} catch (Throwable t) {
		ConfigMarket.logWriter.log(getName() + ": Somting wrong : " + t, LogPrinter.ERROR);
		t.printStackTrace(ConfigMarket.logWriter.getPrintWriter());
		( (Graber)threadGroup ).sendError();
	}
	srcOutStream.writeObject(null); // Set For Download mesage for End
	numSubSrc = downloaded.size();
	ConfigMarket.logWriter.log(getName() + ": Finish. Downloaded pages: " + downloaded.size() , LogPrinter.INFO);

	//   working = false; //Down flag that Working	
	downloaded = null;
}
/**
 * In the end of grabbing send processing time and number of sub sourcees for baseSrcKey on SrcServer 
 * Creation date: (12/25/99 7:23:37 PM)
 * @return boolean
 * @param num int
 * @param baseSrcKey long
 * @param procTime long
 * @param numSubSrc int 
 */
public static boolean sendFinishSrcAccount( int num, long srcKey, long procTime, int numSubSrc ){

	StringBuffer ret_srcValue = new StringBuffer( Const.MAX_LEN_URL );

	try{
		
	  URL ServletURL = new URL( ConfigMarket.hostSourceServer +"?"+ Const.REQ_TYPE +"="+ Const.FINISH_SRC+ 
		  "&" + Const.BASE_SRC_KEY +"="+ srcKey +
		  "&" + Const.PROCESS_TIME +"="+ procTime +
		  "&" + Const.NUM_SUB_SRC +"="+ numSubSrc +
		  "&" + Const.MARKET_KEY +"="+ ConfigMarket.marketKey ); 

	  InputStream in = ServletURL.openStream();
	  
	  int b; 
	
 	  while ((b =in.read())!= -1){ 
	 	  ret_srcValue.append((char)b);  
	  } 
 
	  return Boolean.valueOf( ret_srcValue.toString().trim() ).booleanValue();;

	}
	catch(IOException e){
  		ConfigMarket.logWriter.log("Netrunner"+num+": Can't send finish account for SrcKey: "+srcKey+"!", LogPrinter.ERROR);
		e.printStackTrace(ConfigMarket.logWriter.getPrintWriter());
		return false;
	}
	
}
/**
 * Get srcKey for srcValue from SourceServer
 * Creation date: (12/25/99 7:23:37 PM)
 * @return long ( srcKey )
 * @param srcValue String
 * @param langKey int
 * @param baseSrcKey int
 * @param market_key int
 */
public long srcResolveString( String srcValue, int langKey, long baseSrcKey, int market_key) {

	StringBuffer ret_srcValue = new StringBuffer( Const.MAX_LEN_KEY );
	String encoded_srcValue = URLEncoder.encode( srcValue );
	
	try{
		
	  URL ServletURL = new URL( ConfigMarket.hostSourceServer +"?"+ Const.REQ_TYPE +"="+ Const.RESOLV_KEY+ 
		  "&" + Const.SRC_STRING +"="+ encoded_srcValue + 
//		  "&" + Const.BASE_SRC_KEY +"="+ baseSrcKey +
		  "&" + Const.MARKET_KEY +"="+ ConfigMarket.marketKey +
		  "&" + Const.LANG_KEY +"="+ langKey ); 

	  InputStream in = ServletURL.openStream();
	  
	  int b; 
	
 	  while ((b =in.read())!= -1){ 
	 	  ret_srcValue.append((char)b);  
	  } 
 
	  return Integer.valueOf(ret_srcValue.toString()).intValue();

	}
	catch(IOException e){
		ConfigMarket.logWriter.log( getName()+": Can't resolve Src Key! ( Conection fail ) ", LogPrinter.ERROR);	
		return 0;
	}
	catch(NumberFormatException e){
		ConfigMarket.logWriter.log( getName()+": Can't resolve Src Key! ( Resolve deny ) ", LogPrinter.ERROR);	
		return 0;
	}
	

}
/**
 * Start URLGrabber groupe. 
 * 1. Start Downloader
 * 2. Start Parser
 * 3. Start TextSpliter 
 * Creation date: (1/2/00 10:30:16 PM)
 */
public void startURLGrabberGroupe() {

// 1. Start Downloader
   mDownloader.start();
   
// 2. Start Parser
   mParser.start();

// 3. Start Swapper
   mSwapper.start();

// 4. Start TextSpliter
   mTextSplitter.start();
		
}
}

