package com.nms.server.thread.overrunData;

import java.io.File;
import java.util.Calendar;
import java.util.LinkedList;

import org.apache.log4j.Logger;

import com.nms.server.bean.MissionResult2;
import com.nms.server.common.Common;
import com.nms.server.common.Constants;
import com.nms.server.dao.CommonDao;
import com.nms.server.service.UpgradeService;
import com.nms.server.util.ExceptionPrintUtils;
import com.nms.server.util.FileUtils;


/**
 * 任务结果处理线程
 *  @date Nov 16, 2011 1:25:26 PM
 *	@author ZhangGang
 *
 */
public class MissionResultFileResoveThread implements Runnable{
	private Logger logger = Logger.getLogger(MissionResultFileResoveThread.class);
	private String name;
	private String dirPath;
	volatile boolean stop = false;//线程是否被取消标志
	public MissionResultFileResoveThread (String name,String dirPath){
		this.name= name;
		this.dirPath = dirPath;
	}
	
	/**
	 * 
	 * 硬盘任务结果数据 解析入库
	 * @author Administrator Feb 21, 2013
	 * @version 1.0 
	 */
	public void run() {
//		Thread.currentThread().setName("任务结果文件解析线程");
		Thread.currentThread().setName("Task Result File Parsing Thread");
		logger.info("文件夹路径 :>" + dirPath);
		File driFile = new File(dirPath);
			
		if(driFile.exists()) {
			
			// 获取目录下的.csv文件集合
			File[] filesTmp = FileUtils.listAllFilesEndWith(driFile, "result");
			File[] files = FileUtils.sortByFileNameASC(filesTmp); // 按文件名称 升序排序
			
			// 解析文件数为0时，终止该计划任务
			if(files==null || files.length==0){
				logger.debug("文件夹路径 :>" + driFile.getAbsolutePath() + " 下"  +  "无数据文件，解析开始");
				return;
			}
			
			int max = 500,i=0;
			long l = Calendar.getInstance().getTimeInMillis();
			
			if (files != null && files.length > 0) {

				CommonDao dao = null;
				try {
					dao = new CommonDao();
					UpgradeService service = new UpgradeService(dao);
					
					logger.debug("文件夹路径 :>" + driFile.getAbsolutePath() + " 下 "  + files.length + "个文件，解析开始");
					LinkedList<MissionResult2> mr2List1 = new LinkedList<MissionResult2>();
					LinkedList<MissionResult2> mr2List4 = new LinkedList<MissionResult2>();
					LinkedList<MissionResult2> mr2List6 = new LinkedList<MissionResult2>();
					for (File file : files) {
						try {
							MissionResult2 mr2 = (MissionResult2)FileUtils.readObjFomFile(file);
							if(mr2 != null){
								switch (mr2.getMissionType().intValue()) {
								case 1:
									mr2List1.add(mr2);
									break;
								case 4:
									mr2List4.add(mr2);
									break;
								case 6:
									mr2List6.add(mr2);
									break;
								default:
									break;
								}
							}
						} catch (Exception e) {		//???????
							FileUtils.copyFile(file, new File(Constants.ERROR_DETEC_FILE_DIR+"/"+file.getName()));
							logger.error("Hard disk data (monitoring data) file reading error："+Constants.ERROR_DETEC_FILE_DIR+"/"+file.getName(),e);
						}finally{
							file.delete();
						}
						
						//计数自增1
						i++;
						if(i>max){		//大于max就保存入库
							readResultDataFile(mr2List1,1,dao);
							mr2List1.clear();
							readResultDataFile(mr2List4,4,dao);
							mr2List4.clear();
							readResultDataFile(mr2List6,6,dao);
							mr2List6.clear();
							i=0;
						}
					
						//判断当前线程是否被中断
						if (Thread.currentThread().isInterrupted()) {
							// 线程中断状态，不会改变中断状态的值
							logger.info("任务结果数据解析线程 被中断");
							stop = true;
						}
					}
					
					service.updateCommonMissionComplete();//任务状态：成功（31）、部分成功（32）、全部失败（30）
					service.updateLoopMissionComplete();
				} catch (Exception e) {
					logger.error("", e);
				}finally{
					if(dao!=null){
						dao.close();
						dao=null;
					}
				}
			}
			logger.debug(driFile.getAbsolutePath()+" 解析完成耗时：>"+(Calendar.getInstance().getTimeInMillis()-l));
				
			//清理文件
			files = FileUtils.sortByFileNameASC(FileUtils.listAllFilesEndWith(driFile, "tp")); // 按文件名称 升序排序
			if(files!=null && files.length>0){
				for(File file : files){
					file.delete();
				}
			}
		}
		logger.debug("临时文件清理完成");

	}

	public void readResultDataFile(LinkedList<MissionResult2> mr2List,int i,CommonDao dao) {

		try {
			UpgradeService service = new UpgradeService(dao);
			dao.setAutoCommit(false);
			//-- 集合不为空则进行解析 存在removeList情况 ，优化方式可参考 监测数据解析的实现方式
			if(mr2List!=null && mr2List.size()>0){
				
				service.updateMissionResult2ByBatch(i,mr2List);		//保存mr2List中的数据

				service.updateCommonMissionStateDesc(i,mr2List);//i代表任务类型（1,4,6）-非周期任务

				if (i==4){
					service.updateLoopMissionStateDesc(mr2List);//更新任务类型4的周期任务的状态描述
				}
				
				dao.commit();
			}
		} catch (Exception e) {
			logger.error(ExceptionPrintUtils.printExceptionStack(e));
			try {
				if(dao!=null)dao.rollback();
			} catch (Exception e1) {
				logger.error(ExceptionPrintUtils.printExceptionStack(e1));
			}
		}finally{
			if(dao!=null){
				dao.clearConn();
			}
		}
	}
	
	public static void main(String[] args) {
		System.out.println(""+Constants.OVERRUN_RESULT_FILE_DIR);
//		MissionResultFileResoveThread thread = new MissionResultFileResoveThread("名字",Constants.OVERRUN_RESULT_FILE_DIR);
		MissionResultFileResoveThread thread = new MissionResultFileResoveThread("Name",Constants.OVERRUN_RESULT_FILE_DIR);
		Common.service.submit(thread);
//		LinkedList<String> lks = new LinkedList<String>();
//		lks.add("1");
//		lks.add("2");
//		lks.add("3");
//		
//		LinkedList<String> lks2 = null;
//		lks2 = (LinkedList<String>)lks.clone();
//		for(String s:lks2) {
//			System.out.println(s);
//		}
//		
//		lks.add("4");
//		lks.set(0, "00");
//		
//		lks2.remove(0);
//		for(String s:lks2) {
//			System.out.println(s);
//		}
//		
//		for(String s:lks) {
//			System.out.println(s);
//		}
//		Future<?> future2 = Common.service.submit(new MissionResultFileResoveThread("任务结果入库线程"));
//		Common.getFutureMap().put(Constants.MISSION_RESULT_RESOVE, future2);
//		
//		System.out.println("启动ok。。。");
//		
//		Future<?> future = Common.getFutureMap().get(Constants.MISSION_RESULT_RESOVE);
//		System.out.println(future.isCancelled());
//		System.out.println(future.isDone());
//		try
//		{
////			Thread.sleep(1000);
//			if(future!=null&&!future.isCancelled()&&!future.isDone()) {
//					System.out.println("开始中断。。。");
//					Thread.sleep(536);//这个时间是经过多次测试出来的
//	//				Thread.sleep(100);
//					future.cancel(true);//停解析任务结果数据入库线程
//			}
//			Thread.sleep(3000);
//			Common.service.shutdownNow();
//			System.out.println(future.isCancelled());
//			System.out.println(future.isDone());
//		} catch (InterruptedException e)
//		{
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		
	}
	
}
