package market;

import java.util.*;
import java.io.*;

import market.util.text.MasEnums;
import market.util.text.Text;
import market.util.LogPrinter;


/**
 * Contein all init data to start market. <br>
 * It load market configuration file.
 * Creation date: (12/29/99 3:42:38 PM)
 * @author: tin
 */

public class ConfigMarket {
	
	public static int marketKey = 1;
	public static String MarketMasterName = "MarketServlet";
	
	public static String marketName = "MarketTest-0.01";
	public static String nameMarketName = "marketName";
	
	public static String marketDescription = "Testing ResourceServer, SourceServer, market_wrServer, market_wrServer and market_RDVServer";
	public static String nameMarketDescription = "marketDeskription";
	
	public static String marketLocation= "http://www.linux.esof";
	public static String nameMarketLocation = "marketLocation";
	
	public static String hostResourceServer = "http://www.server.esof/test/ResourceServer";
	public static String nameHostResourceServer = "hostResourceServer";
	
	public static String hostSourceServer = "http://www.mobile.esof:8080/servlet/SrcServer";
	public static String nameHostSourceServer = "hostSourceServer";
	
	public static String hostMarketWrServer = "http://www.market.esof:8080/servlet/market_wrServer";
	public static String nameHostMarketWrServer = "hostMarketWrServer";
	
	public static String hostMarketRwServer = "http://www.market.esof:8080/servlet/market_rwServer";
	public static String nameHostMarketRwServer = "hostMarketRwServer";

	public static String marketWrServer = "market_wrServer";
	public static String nameMarketWrServer = "marketWrServer";
	
	public static String marketRwServer = "market_rwServer";
	public static String nameMarketRwServer = "marketRwServer";

	public static String marketMDVServer = "MDVServer";
	public static String nameMarketMDVServer = "MDVServer";
	
	public static String hostMarketMaster = "http://www.server.esof:8080/servlet/MarketServlet";
	public static String nameHostMarketMaster = "hostMarketMaster";
	
	public static String hostMDVServer = "http://www.server.esof:8080/servlet/MDVServer";
	public static String nameHostMDVServer = "hostMDVServer";
	
	public static String hostM_docsDB = "jdbc:mysql://www.server.esof:3306";
	public static String nameHostM_docsDB = "hostM_docsDB";
	
	public static String m_docsDBName = "Market_Docs";
	public static String nameM_docsDBName = "m_docsDBName";

	public static String m_docsDBDriver = "org.gjt.mm.mysql.Driver";
	public static String nameM_docsDBDriver = "m_docsDBDriver";
	
	public static String m_docsDBUser = "root";
	public static String nameM_docsDBUser = "m_docsDBUser";
	
	public static String m_docsDBPassword = "";
	public static String nameM_docsDBPassword = "m_docsDBPassword";
	
	public static String m_DocsFilePath = "g:\\market\\m_docs";
	public static String nameM_DocsFilePath = "m_DocsFilePath";

	public static String m_SwapLinksFilePath = "g:\\market\\m_swapLinks";
	public static String nameM_SwapLinksFilePath = "m_SwapLinksFilePath";
	
	public static String[] contentType = { "text/plant", "text/html" };
	public static String nameContentType = "contentType";

	public static DocsCacher mDocsCacher = null ;
		
	public static int startPosForCheck = 0;
	public static String nameStartPosForCheck = "startPosForCheck";
	
	public static int stopPosForCheck = 10;
	public static String nameStopPosForCheck = "stopPosForCheck";
	
	public static MasEnums AcceptCharEnum;
	
	public static int MAX_DOC_SIZE = 64000;
	public static String nameMAX_DOC_SIZE = "MAX_DOC_SIZE";

	public static String nameFileLogLevel = "fileLogLevel";
	public static int fileLogLevel = LogPrinter.ERROR;

	public static String nameScreenLogLevel = "screenLogLevel";
	public static int screenLogLevel = LogPrinter.ERROR;

	public static String nameNumber_WrProcessor = "number_WrProcessor";
	public static int number_WrProcessor = 4;
	
	public static String nameWrProcessorTimeSleep = "WrProcessorTimeSleep";
	public static int wrProcessorTimeSleep = 200;
	
	public static LogPrinter logWriter = null;
	
	public static String logFilePath = "d:\\martin\\last\\logs\\log.txt" ;
	public static String nameLogFilePath = "logFilePath";
	
	public static String marketCfgPath = "d:\\martin\\last\\market.cfg" ;
/**
 *  This field contein path to configuration file: market.cfg
 */	
	public static String nameMarketCfgPath = "marketCfgPath";

	// Queue limit
	public static int sizeSwapLinks = 50;

	public static int NETRUNNER_OUT = 10;
	public static int NETRUNNER_IN = 10;
	public static int DOWNLOADER_OUT = 10;
	public static int PARSER_LINK_OUT = 50;
	public static int PARSER_TEXT_OUT = 20;
	public static int TEXT_SPLITTER_OUT = 50;


	public static boolean isInit = false;
	
//	Instance of other market servlet
	public static market.market_util.m_rwServer rwServer = null;
	public static market.market_util.m_wrServer wrServer = null;
	public static market.MDVServer.MDVInterFace mdvServer = null;
	
//	public static market_MDVServer mdvServer = null; 

/**
 * This is constructor.
 * Creation date: (1/6/00 4:57:29 PM)
 */
public ConfigMarket() {
	super();
	//log = new ConfigLogs();
	mDocsCacher = new DocsCacher();
	FillAcceptCharEnums();
}
/**
 * Load file whit market init data
 * Creation date: (1/6/00 4:03:18 PM)
 * @return boolean
 * @param fileProperty java.lang.String
 */
public static boolean cfgLoadProperty(String fileProperty) {

	System.out.println( "Try load config file: " + fileProperty);

	Properties prop = new Properties();
	FileInputStream propStream;
	
	try{
		
		propStream = new FileInputStream( fileProperty );
		
		prop.load(propStream);
		
		prop.list( System.out );
		propStream.close();
		
	}
	catch( FileNotFoundException e ){
		System.out.println( "Can't find file: " + fileProperty +"\n Load defalt init data.");
		return false;
	}
	catch( IOException e ){
		System.out.println( "Can't read from file: " + fileProperty 
							+"\n Load defalt init data.");
		return false;
	}
	String tmp = "empty";
	try{
		tmp = prop.getProperty( Const.MARKET_KEY );
		marketKey = Integer.valueOf(tmp).intValue();

		tmp = prop.getProperty( nameMAX_DOC_SIZE, String.valueOf(MAX_DOC_SIZE) );
		MAX_DOC_SIZE = Integer.valueOf(tmp).intValue();

		tmp = prop.getProperty( nameFileLogLevel, String.valueOf(fileLogLevel) );	
		fileLogLevel = Integer.valueOf(tmp).intValue();

		tmp = prop.getProperty( nameScreenLogLevel, String.valueOf(screenLogLevel) );
		screenLogLevel = Integer.valueOf(tmp).intValue();

		tmp = prop.getProperty( nameNumber_WrProcessor, String.valueOf(number_WrProcessor) );
		number_WrProcessor = Integer.valueOf(tmp).intValue();
		
		tmp = prop.getProperty( nameWrProcessorTimeSleep, String.valueOf(wrProcessorTimeSleep) );
		wrProcessorTimeSleep = Integer.valueOf(tmp).intValue();

	}
	catch(Exception e){
		System.out.println( "Incorect parameter: " + tmp );
		return false;		
	}

	marketName = prop.getProperty( Const.MARKET_NAME, marketName );
	marketDescription = prop.getProperty( nameMarketDescription, marketDescription );
	hostResourceServer = prop.getProperty( nameHostResourceServer, hostResourceServer );
	hostSourceServer = prop.getProperty( nameHostSourceServer, hostSourceServer );
	hostMarketWrServer = prop.getProperty( nameHostMarketWrServer, hostMarketWrServer );
	hostMarketRwServer = prop.getProperty( nameHostMarketRwServer, hostMarketRwServer );
	hostMarketMaster = prop.getProperty( nameHostMarketMaster, hostMarketMaster );
	hostMDVServer = prop.getProperty( nameHostMDVServer, hostMDVServer );
	logFilePath	= prop.getProperty( nameLogFilePath, logFilePath );
	m_DocsFilePath	= prop.getProperty( nameM_DocsFilePath, m_DocsFilePath );
	m_SwapLinksFilePath	= prop.getProperty( nameM_SwapLinksFilePath, m_SwapLinksFilePath );
	hostM_docsDB = prop.getProperty( nameHostM_docsDB, hostM_docsDB );
	
	m_docsDBName = prop.getProperty( nameM_docsDBName, m_docsDBName );
	m_docsDBDriver = prop.getProperty( nameM_docsDBDriver, m_docsDBDriver );
	m_docsDBUser = prop.getProperty( nameM_docsDBUser, m_docsDBUser );
	m_docsDBPassword = prop.getProperty( nameM_docsDBPassword, m_docsDBPassword );

		
	return true;
	
}
/**
 * Save file whit market init data
 * Creation date: (1/6/00 4:03:18 PM)
 * @return boolean
 * @param fileProperty java.lang.String
 */
public static boolean cfgSaveProperty(String fileProperty) {
	ConfigMarket.logWriter.log("MarketConfig: Try save config file: " + fileProperty, LogPrinter.DEBUG_1);
	StringBuffer tmp = new StringBuffer(2000);
	tmp.append(Const.MARKET_KEY); tmp.append("="); tmp.append(marketKey);
	tmp.append("\n");
	tmp.append(Const.MARKET_NAME); tmp.append("=");	tmp.append(marketName);
	tmp.append("\n");
	tmp.append(nameMarketDescription);	tmp.append("="); tmp.append(marketDescription);
	tmp.append("\n");
	tmp.append(nameHostResourceServer);	tmp.append("="); tmp.append(hostResourceServer);
	tmp.append("\n");
	tmp.append(nameHostSourceServer); tmp.append("="); tmp.append(hostSourceServer);
	tmp.append("\n");
	tmp.append(nameHostMarketWrServer);	tmp.append("="); tmp.append(hostMarketWrServer);
	tmp.append("\n");
	tmp.append(nameHostMarketRwServer);	tmp.append("="); tmp.append(hostMarketRwServer);
	tmp.append("\n");
	tmp.append(nameHostMarketMaster); tmp.append("="); tmp.append(hostMarketMaster);
	tmp.append("\n");
	tmp.append(nameHostMDVServer); tmp.append("="); tmp.append(hostMDVServer);
	tmp.append("\n");

	//	tmp.append( nameMarketCfgPath ); tmp.append("="); tmp.append( marketCfgPath ); tmp.append("\n");
	tmp.append(nameLogFilePath); tmp.append("="); tmp.append(Text.strSetDoubleSlash(logFilePath));
	tmp.append("\n");
	tmp.append(nameM_DocsFilePath); tmp.append("="); tmp.append(Text.strSetDoubleSlash(m_DocsFilePath));
	tmp.append("\n");
	tmp.append(nameM_SwapLinksFilePath); tmp.append("="); tmp.append(Text.strSetDoubleSlash(m_SwapLinksFilePath));
	tmp.append("\n");
	tmp.append(nameMAX_DOC_SIZE); tmp.append("="); tmp.append(MAX_DOC_SIZE);
	tmp.append("\n");
	tmp.append(nameHostM_docsDB); tmp.append("="); tmp.append(hostM_docsDB);
	tmp.append("\n");
	tmp.append(nameM_docsDBDriver); tmp.append("="); tmp.append(m_docsDBDriver);
	tmp.append("\n");
	tmp.append(nameM_docsDBName); tmp.append("="); tmp.append(m_docsDBName);
	tmp.append("\n");
	tmp.append(nameM_docsDBUser); tmp.append("="); tmp.append(m_docsDBUser);
	tmp.append("\n");
	tmp.append(nameM_docsDBPassword); tmp.append("="); tmp.append(m_docsDBPassword);
	tmp.append("\n");
	tmp.append(nameFileLogLevel); tmp.append("="); tmp.append(fileLogLevel);
	tmp.append("\n");
	tmp.append(nameScreenLogLevel); tmp.append("="); tmp.append(screenLogLevel);
	tmp.append("\n");
	tmp.append(nameNumber_WrProcessor);	tmp.append("="); tmp.append(number_WrProcessor);
	tmp.append("\n");
	tmp.append(nameWrProcessorTimeSleep);	tmp.append("="); tmp.append(wrProcessorTimeSleep);
	tmp.append("\n");
	FileWriter propStream;
	try {
		propStream = new FileWriter(fileProperty);
		propStream.write(tmp.toString());
		propStream.close();
	} catch (FileNotFoundException e) {
		ConfigMarket.logWriter.log("MarketConfig: Can't find file path: " + fileProperty, LogPrinter.ERROR);
		return false;
	} catch (IOException e) {
		ConfigMarket.logWriter.log("MarketConfig: Can't write to file: " + fileProperty, LogPrinter.ERROR);
		return false;
	}
	return true;
}
public static void FillAcceptCharEnums() {

	AcceptCharEnum = new MasEnums();
	
}
/**
 * Load propertys from market.cfg file and create logPrinter .
 * Creation date: (29.2.2000 “. 22:31:42)
 * @return boolean
 * @param cfgPath java.lang.String
 */
public synchronized static boolean init( String cfgPath ) {
// Load file: market.cfg ( marketName, marketDescribtion, ... ) in static field on ConfigMarket
	System.out.println( "Try init MarketConfig: " );
	
	isInit = false;
	marketCfgPath = cfgPath;

	if ( cfgLoadProperty( cfgPath ) ){
		System.out.println( "Try create LogWriter" );
		logWriter = LogPrinter.makeLogPrinter( logFilePath );

		logWriter.setLogLevel( fileLogLevel );
		logWriter.setScreenLogLevel( screenLogLevel );
		
		mDocsCacher = new DocsCacher();
		FillAcceptCharEnums();
				
		isInit = initMDocs_Cache();
	
	}
	
	return isInit;
}
/**
 * Load propertys from market.cfg file and create logPrinter .
 * Creation date: (29.2.2000 “. 22:31:42)
 * @return boolean
 * @param cfgPath java.lang.String
 */
public static boolean initMDocs_Cache() {
	// Load file: market.cfg ( marketName, marketDescribtion, ... ) in static field on ConfigMarket

	if (!mDocsCacher.loadCache()) {
		ConfigMarket.logWriter.log("ConfigMarket: Can't load MDocs_Cacher!", LogPrinter.ERROR);
		ConfigMarket.logWriter.log("ConfigMarket: Try create m_Docs Cache Structure...", LogPrinter.INFO);
		if (!mDocsCacher.createMDocs_Structure()) {
			ConfigMarket.logWriter.log("ConfigMarket: Can't create m_Docs Cache Structure!", LogPrinter.ERROR);
			return false;
		}

	}
	
	return true;
}
public static void main( String[] args ){

	ConfigMarket cfgM = new ConfigMarket();

	System.out.println("cfgM.hostMarketMaster: "+cfgM.hostMarketMaster);
	cfgM.cfgLoadProperty( args[0] );
	
	cfgM.cfgSaveProperty( args[0] );
	System.out.println("ConfMarket.hostMarketMaster: "+ConfigMarket.hostMarketMaster);
	System.out.println("cfgM.hostMarketMaster: "+cfgM.hostMarketMaster);
	
		

}
/**
 * Set Value of configuration parameter.
 * Creation date: (16.2.00 16:00:55)
 * @return boolean
 * @param paramName java.lang.String
 * @param paramValue java.lang.String
 */
public static boolean setParam(String paramName, String paramValue) {
	if (paramName.equalsIgnoreCase(nameMarketCfgPath)) {
		marketCfgPath = paramValue;
		return true;
	}
	if (paramName.equalsIgnoreCase(nameLogFilePath)) {
		logFilePath = paramValue;
		return true;
	}
	if (paramName.equalsIgnoreCase(nameMarketLocation)) {
		marketLocation = paramValue;
		return true;
	}
	if (paramName.equalsIgnoreCase(nameMAX_DOC_SIZE)) {
		try {
			MAX_DOC_SIZE = Integer.valueOf(paramValue).intValue();
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	// Hosts
	// System said
	if (paramName.equalsIgnoreCase(nameHostResourceServer)) {
		hostResourceServer = paramValue;
		return true;
	}
	if (paramName.equalsIgnoreCase(nameHostSourceServer)) {
		hostSourceServer = paramValue;
		return true;
	}

	// Market said
	if (paramName.equalsIgnoreCase(nameHostMarketWrServer)) {
		hostMarketWrServer = paramValue;
		return true;
	}
	if (paramName.equalsIgnoreCase(nameHostMarketRwServer)) {
		hostMarketRwServer = paramValue;
		return true;
	}
	if (paramName.equalsIgnoreCase(nameHostMDVServer)) {
		hostMDVServer = paramValue;
		return true;
	}

	// DB identification	
	if (paramName.equalsIgnoreCase(nameM_docsDBUser)) {
		m_docsDBUser = paramValue;
		return true;
	}
	if (paramName.equalsIgnoreCase(nameM_docsDBPassword)) {
		m_docsDBPassword = paramValue;
		return true;
	}

// Log Levels	
	if (paramName.equalsIgnoreCase(nameFileLogLevel)) {
		try {
			fileLogLevel = Integer.valueOf(paramValue).intValue();
			logWriter.setLogLevel( fileLogLevel );
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
	if (paramName.equalsIgnoreCase(nameScreenLogLevel)) {
		try {
			screenLogLevel = Integer.valueOf(paramValue).intValue();
			logWriter.setScreenLogLevel( screenLogLevel );
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	if (paramName.equalsIgnoreCase(nameWrProcessorTimeSleep)) {
		try {
			wrProcessorTimeSleep = Integer.valueOf(paramValue).intValue();
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	return false;
}
}

