package com.csc.library.service;

import java.util.HashMap;

import com.csc.library.database.StaticProperties;
import com.csc.library.process.DbProcess;
import com.csc.library.session.InitialEnvironment;
import com.csc.library.utilities.MyLog;
import com.csc.library.utilities.UProfile;

/**
 * ��Ѻ background process
 * @author Administrator
 */

public class CreateProcess extends ThreadProcess {
	private DbProcess process;
//	private HashMap param;
	private String schemaName = "";
	private String index = "";
//	private UProfile upf = null;
	private String status = "";
	
	public CreateProcess() {
		super();
	}
	
	public void setProcess(String processid, String index, DbProcess db) {
		this.process = db;
		this.index = index;
		this.setProcessID(processid);
		this.process.setProcessCode(this.processID+":"+index);
		schemaName = new InitialEnvironment("GLOBAL").getValue("schema-name");
	}
	
	public void setProcessID(String processid){
		this.processID = processid;
		this.setName( "process_" +processID);
	}	
	
//	public void setUProfile(UProfile upf) {
//		this.upf = upf;
//	}
	
	public void run() {
		long starttime = System.currentTimeMillis();
		try {
			if(this.param.containsKey("UProfile")) {
				this.upf = (UProfile) this.param.get("UProfile");
			} else {
				this.upf = (UProfile) this.param.get("uprofile");
			}
			System.out.println("InitialProcess Process "+process.getClass().getName());
			StaticProperties.myConnection.beginTransaction(this.upf, this);
            this.upf.set("fsecurity","1");
            this.upf.set("processID", processID);
            this.upf.setProcessid(processID);
            this.setProcessID(processID);
			this.process.process();
			long endtime = System.currentTimeMillis();
			
			if(!this.status.equalsIgnoreCase("D")&&!this.status.equalsIgnoreCase("C")) {
				MyLog.debug(this,this.upf,"END TIME [Complete Process]  Thread["+this.getId()+"] [processid="+processID+"] [STATUS="+this.status+"] Time used=[" +(endtime-starttime)+"]");
				StaticProperties.serverManager.completeProcess(processID, this.process.getMessage(), this.process.getFullMessage(),this.process);
				StaticProperties.myConnection.endTransaction(this.upf, this);
			} else {
				MyLog.debug(this,this.upf,"END TIME [Cancel Process]  Thread["+this.getId()+"] [processid="+processID+"] [STATUS="+this.status+"] Time used=[" +(endtime-starttime)+"]");
				StaticProperties.serverManager.cancelProcess(processID, this.process.getFullMessage(),this.process,this.status);
				StaticProperties.myConnection.rollback(this.upf, this);
			}
			Runtime.getRuntime().gc();						
		} catch (Exception e) {
			MyLog.error(this, this.upf, e);
			try {
				MyLog.debug(this,this.upf,"END TIME [Incomplete Process] Thread["+this.getId()+"] [STATUS="+this.status+"] [processid="+processID+"]" + System.currentTimeMillis());
				StaticProperties.serverManager.incompleteProcess(processID, e.getMessage(), e.getMessage(),this.process);
				StaticProperties.myConnection.rollback(this.upf, this);
			} catch (Exception ex) {
				MyLog.error(this, this.upf, e);
			}			
			
		}finally{
			if(this.process!=null){
				this.process.closeConnection();
				this.process=null;
			}
		}
	}
	
//	public void setParam(HashMap param) {
//		this.param = param;
//	}
	
	public String getStatus() {
		return status;
	}
	
	public void setStatus(String status) {
		this.status = status;
	}
	
	public void setExportType(String export_type) {
	
	}
	
//	public void setClassName(String className) {
//
//	}	
		
	@Override
	public void destroy() {
		System.out.println("END TIME Process [destroy] Thread["+this.getId()+"] [processid="+processID+"]" + System.currentTimeMillis());
	}
}