package com.connor.signoff.soa.handler;

import java.io.InputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.SocketException;
import java.net.URISyntaxException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.TimeoutException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.teamcenter.clientx.AppXSession;
import com.teamcenter.services.strong.administration.PreferenceManagementRestBindingStub;
import com.teamcenter.services.strong.administration.PreferenceManagementService;
import com.teamcenter.services.strong.administration._2012_09.PreferenceManagement;
import com.teamcenter.services.strong.core.DataManagementService;
import com.teamcenter.soa.client.model.ModelObject;
import com.teamcenter.soa.client.model.strong.Dataset;
import com.teamcenter.soa.client.model.strong.User;
import com.teamcenter.soa.client.model.strong.WorkspaceObject;
//import com.teamcenter.rac.aif.AbstractAIFApplication;
//import com.teamcenter.rac.aif.kernel.AIFComponentContext;
//import com.teamcenter.rac.aifrcp.AIFUtility;
//import com.teamcenter.rac.ui.common.RACUIUtil;
//import com.teamcenter.rac.util.FileUtility;
//import com.teamcenter.rac.util.MessageBox;
//import com.teamcenter.soa.client.model.Property;
//import com.teamcenter.soa.client.model.strong.User;
//import com.teamcenter.soa.exceptions.NotLoadedException;


/**
 * 此类继承系统InterfaceDatasetAction类，用于重写preProcess方法在打开 数据集 时前操作。
 * 
 * @author hubing
 * @version 1.0, 2015-01-6
 */

public class OpenDatasetSignoff{
	private static final boolean debug = false;
	private static String exePath;//包内路径
	private static String[] refValues;//属性映射数组
	private static AppXSession session;
//	private static PreferenceManagementService tcp;
//	private TCPreferenceService tcp;
	// 关闭数据集的时候触发，我们可以通过此方法实现从数据集的命名引用文件关联属性到我们的表单或者版本等
	private int waitPdf = 0;
	private int count = 0;// 半秒

	public static void main(String[] args) {
		if (args.length > 0) {
			if (args[0].equals("-help") || args[0].equals("-h")) {
				System.out.println("usage: java [-Dhost=http://server:port/tc] com.teamcenter.hello.Hello");
				System.exit(0);
			}
		}

		// Get optional host information
		String serverHost = "http://192.168.2.242:7001/tc";
		String host = System.getProperty("host");
		if (host != null && host.length() > 0) {
			serverHost = host;
		}

		session = new AppXSession(serverHost);
//		HomeFolder home = new HomeFolder();
//		Query query = new Query();
//		DataManagement dm = new DataManagement();

		// Establish a session with the Teamcenter Server
		User user = session.login();

		PreferenceManagementService tcp = PreferenceManagementService.getService(AppXSession.getConnection());
		String path = "C:\\Users\\HX\\eclipse-workspace\\";
		exePath = path;//.substring(1, path.indexOf("com.connor.signoff")).replace("/", "\\");
//		refValues = tcp.getStringArray(TCPreferenceService.TC_preference_site, "HxCaxaMapping");
		PreferenceManagement.GetPreferencesResponse getAttrMappingPreferencesResponse = tcp.getPreferences(new String[] {"HxCaxaMapping"}, true);
		for(PreferenceManagement.CompletePreference completePreference : getAttrMappingPreferencesResponse.response) {

            if(completePreference.definition.name.equals("HxCaxaMapping")){
            	refValues = completePreference.values.values;
            }
        }
		FTPUtils.getConfigureInfomationg(tcp,"");
		
		
		preProcess("hgiN5tO1I3go1D");
		
		session.logout();

	}

	
	public static int preProcess(String datasetPuid) {
		System.out.println("代码版本：2023-04-12，进入preProcess...");
		//获取数据集
		DataManagementService dataManagementService = DataManagementService.getService(AppXSession.getConnection());
		Dataset dataset = (Dataset) dataManagementService.loadObjects(new String[] {datasetPuid}).getPlainObject(0);
		//数据集校验
		if(!dataSetVerification(dataset)) {return 0;}
		
		//执行打开CAXA集成工具注册表修改
//		openCad();
//		
//		// 对于已经发布的文件也要判断是否要属性映射
		// 如果caxa数据集是只读的，当修改时间<=发布时间，允许生成pdf；如果修改时间>发布时间,就只读打开，不需要做属性映射和转pdf
		boolean openDirect = false;// true为不生成pdf
//		openDirect = isCaxaDatasetRegen(tccomponentdataset, openDirect);
		
		if (openDirect) {
			return 0;
		}
//		//获取TC打开数据集的路径
//		String exportedCaxaFilePath = TcUtils.getCaxaFile(arg1);
//		
//		if (openDirect && exportedCaxaFilePath != null) {
//			if (debug)
//				System.out.println("不更新签字:" + exportedCaxaFilePath);
//			//不要签字
//		}else {
//			if (debug)
//				System.out.println("更新签字:" + exportedCaxaFilePath);
//			//要签字
//		}
//
//		if (exportedCaxaFilePath != null && (exportedCaxaFilePath.toLowerCase().endsWith(".exb")
//				|| exportedCaxaFilePath.toLowerCase().endsWith(".cxp"))) {
//			try {
//				
//				hx_SetCAXAFileOrigin(tccomponentdataset, tcp, "",openDirect);
//				
//			} catch (Exception e) {
//				e.printStackTrace();
//				MessageBox.post("Teamcenter异常："+e.getMessage(), "", MessageBox.ERROR);
//			}
//		}
//		//openCad();
		return 0;
	}
//	
//	@Override
//	public boolean postProcess(TCComponentDataset arg0, String arg1, int arg2) {
//		System.out.println("进入PostProcess...");
//		System.out.println("PostProcess版本:2023-05-22...");
//		//数据集校验
//		
//		if(!dataSetVerification(arg0)) {return false;}
//		File finalCaxa =TcUtils.getCaxaFile(arg1);
//		
//		openCad();
//		boolean openDirect = false;// true为不生成pdf
//		// 如果caxa数据集是只读的，当修改时间<=发布时间，允许生成pdf；如果修改时间>发布时间,就只读打开，不需要做属性映射和转pdf
//		openDirect = isCaxaDatasetRegen(arg0, openDirect);
//		if (openDirect) {
//			deleteTempReadOnlyFile(arg1, finalCaxa);
//			return false;
//		}
//
//		count = 0;
//		//获取配置中等待pdf转换超时的时间
//		loadWaitPdf();
//		TCComponentItemRevision rev = TcUtils.getReferenceRev(arg0);
//		if (rev != null) {
//			String addPdfPath = "";
//			try {
//				if (debug)
//					System.out.println("添加受控章");
//				// 临时措施 如果修改时间和发布时间小于2分钟，就先做一次属性映射，再转pdf
//				String ftpCaxaName = "";
//				if (!openDirect) {
//					ftpCaxaName = caxaProperty(rev, arg0, finalCaxa);// 属性映射和转pdf
//				}
//					// 添加受控章
//					addPdfPath = addSkz(addPdfPath, ftpCaxaName, rev);
//				
//				if (debug)
//					System.out.println("添加受控章完毕");
//				
//				if (addPdfPath.length() > 0) {
//					if (debug)
//						System.out.println("替换命名引用");
//					// 替换或者新建数据集
//					ChangeDbomUtil.setByPass(true);
//					replaceOrcreate(arg0, rev, session, addPdfPath);
//					ChangeDbomUtil.setByPass(false);
//				}
//			
//			} catch (Exception e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//				MessageBox.post("Teamcenter异常："+e.getMessage(), "", MessageBox.ERROR);
//			}
//		}else if (rev == null) {
//			MessageBox.post("数据集关联多个版本，pdf转换失败", "", MessageBox.INFORMATION);
//		}
//
//		//修复bug，最后需要删除只读文件
//		deleteTempReadOnlyFile(arg1, finalCaxa);
//		return false;
//	}
	/**
	 * 数据集校验
	 * @param dataset 
	 * @param tccomponentdataset 数据集
	 * @return
	 */
	private static boolean dataSetVerification(Dataset dataset) {
		//没有运行PDF
//		if(TcUtils.checkPDF(dataset) == 1) {return false;}
				
		//判断是否打开模板数据集，如果是，则返回
//		if (judgeModel(dataset) == 1) {return false;}
//		
//		//检查命名引用中原文件是否异常
//		if(TcUtils.checkDatasetFileName(dataset) == 1) {return false;};
		
		
		return true;
		
	}
//	/**
//	 * 删除TC判定为只读，但依然需要签字的文件
//	 * @param tcTempDir
//	 * @param finalCaxa
//	 */
//	private void deleteTempReadOnlyFile(String tcTempDir, File finalCaxa) {
//		File tempCacheFile;
//		File[] allFiles;
//		
//		if(finalCaxa.exists()) {
//			
//		}
//		// 当只读打开，且进行caxa签字的情况下：清除所有文件 否则会报错
//		boolean caxaReadOnly = !finalCaxa.canWrite();
//		if (caxaReadOnly) {
//			tempCacheFile = new File(tcTempDir);
//			allFiles = tempCacheFile.listFiles();
//			for (int i = allFiles.length - 1; i >= 0; i--) {
//				allFiles[i].delete();
//			}
//		}
//	}
//	
//	
//	
//	/**
//	 * @param addPdfPath 添加PDF签章
//	 * @param ftpCaxaName
//	 * @param rev
//	 * @return
//	 * @throws Exception 
//	 */
//	private String addSkz(String addPdfPath,String ftpCaxaName,TCComponent rev) throws Exception {
//		String fileName="";
//		String item_id ="";
//		String item_rev_id ="";
//		String qianzhang = "";
//		item_id=rev.getProperty("item_id").trim();
//		item_rev_id=rev.getProperty("item_revision_id").trim();
//		item_id = TcUtils.newString(item_id);
//		qianzhang = rev.getProperty("hx3_qianzhang").trim();
//		if(ftpCaxaName.length()>0) {
//			fileName=ftpCaxaName.split(".exb")[0];
//			// 获取数据集所在的版本，拼接版本id和当前时间作为上传的名称
//			boolean ss = false;
//			//下载属性映射后的pdf文件
//			count = 0 ;
//			boolean convertMark = FTPUtils.downFile(fileName + ".pdf", System.getenv("TEMP"));// 下载pdf到缓存路径下
//			if (convertMark == false) {
//				if (count > waitPdf) {
//					
//					MessageBox.post("CAXA转换PDF超时,请重试", "", MessageBox.INFORMATION);
//				} else {
//					
//					MessageBox.post("CAXA转换PDF异常,请重试", "", MessageBox.INFORMATION);
//				}
//			} else {
//				// 先要签章
//				String addSkzBeforePath=System.getenv("TEMP") + File.separator + fileName + ".pdf";
//				String addSkzAfterPath="";
//				if(FTPUtils.CompanyName.equals("HX")) {
//					addSkzAfterPath=System.getenv("TEMP") + File.separator + item_id + item_rev_id + ".pdf";
//					String designType = rev.getType();
//					String[] imgPath = new String[1];
//					if(qianzhang.equals("受控") || qianzhang.equals("B") || qianzhang.isEmpty()) {
//						
//						exePath = exePath + "skz.png";
//					}
//					else {
//						exePath = exePath + "syz.png";
//					
//					}
//					
//					imgPath[0] = exePath;
//					System.out.println("受控章位置---------------》" + imgPath[0]);
//					addPdfMark(addSkzBeforePath,addSkzAfterPath, imgPath,designType);
//				}
//				
//				File file = new File(addSkzBeforePath);
//				if (file.exists()) {
//					addPdfPath = addSkzBeforePath;
//				} else {
//					
//					addPdfPath = addSkzAfterPath;
//				}
//				
//			}
//		}
//		return addPdfPath;
//	}
//
//	
//	
//	/**
//	 * 后操作服务器签字并取回签字后PDF
//	 * @param rev 
//	 * @param dataset
//	 * @param finalCaxa
//	 * @return
//	 * @throws Exception
//	 */
//	public String caxaProperty(TCComponentItemRevision rev, TCComponentDataset dataset,File finalCaxa) throws Exception {
//		// 先要下载数据集到缓存路径
//
//				if (dataset != null) {
//					String fileOgiginName = "";
//					// 如果名称中包含“。cxp”,就跳过
//					if (dataset.getProperty("object_name").contains(".cxp")
//							|| dataset.getProperty("object_name").contains(".CXP")) {
//						return "";
//					}
//
//					// TODO 获得命名引用的原文件名
//					TCComponent[] ref_list = dataset.getTCProperty("ref_list").getReferenceValueArray();
//					if (ref_list.length == 0) {
//						return "";
//					}
//					if (ref_list.length > 1) {
//						return "";
//					}
//					if (ref_list.length == 1) {
//						fileOgiginName = ref_list[0].getProperty("original_file_name");
//					}
//
//					// TODO 先后上传caxa和xml文件到ftp，等转换后再下载下来
//					String tempCaxaPath = "";
//					System.out.println("开始下载tempCaxaPath");
//					System.out.println(dataset.getProperty("object_name"));
//					tempCaxaPath = TcUtils.downLoadCaxaFile(dataset, rev, finalCaxa);// 下载文件到system temp路径下，命名为当前时间
//
//					// 有可能命名引用为空，当网络不好的时候
//					if (tempCaxaPath.trim().length() == 0) {
//						return "";
//					}
//					System.out.println(tempCaxaPath);
//					System.out.println("tempCaxaPath   caxa复制到本地路径:" + tempCaxaPath);
//					String tempCaxaPathName = tempCaxaPath.substring(tempCaxaPath.lastIndexOf("\\") + 1);
//					second(new File(tempCaxaPath));
//					FileInputStream tempCaxaPathIn = new FileInputStream(new File(tempCaxaPath));
//					System.out.println("开始上传tempCaxaPath:" + tempCaxaPathName);
//					boolean tempCaxa = FTPUtils.uploadFile(tempCaxaPathName, tempCaxaPathIn);
//					if (tempCaxa == false) {
//						System.out.println("upload fail----------------");
//						return "";
//					}
//
//					System.out.println("上传caxa完毕");
//					boolean jump = hx_SetCAXAFile2(dataset, tcp, tempCaxaPathName.substring(0, tempCaxaPathName.length() - 4));
//					if (jump == false) {
//						return "";
//					}
//					second(new File(tempCaxaPath.replace(".exb", ".xml")));
//
//					FileInputStream tempXmlPathIn = new FileInputStream(new File(tempCaxaPath.replace(".exb", ".xml")));
//					System.out.println("上传xml:" + tempCaxaPathName.replace(".exb", ".xml"));
//					boolean tempXml = FTPUtils.uploadFile(tempCaxaPathName.replace(".exb", ".xml"), tempXmlPathIn);
//					if (tempXml == false) {
//						return "";
//					}
//					// 判断是否生成ok或err文件，生成说明属性映射完成，有了再下载
//					System.out.println("下载ok或err");
//					boolean downResult = FTPUtils.downOkOrErrFile(tempCaxaPathName, System.getenv("TEMP"));
//					// 如果下载失败，一般ftp服务器电脑报错“请指定形文件txt。shx的位置（取消将使用设置的缺省字体）”，然后弹出资源管理器定位到“库\文档”
//					if (downResult == false) {
//						return "";
//					}
//					// 如果成功 删除ftp上的同名txt 等待pdf生成
//					System.out.println("删除服务器上文件，触发转换pdf：" + tempCaxaPathName.replace(".exb", ".txt"));
//					boolean getPdf = FTPUtils.deleteTxt(tempCaxaPathName, System.getenv("TEMP"));
//					if (getPdf) {
//						return tempCaxaPathName;
//					}
//				}
//				return "";
//	}
//
//	
//
	/**
	 * @param caxaDataset
	 * @param openDirect  如果caxa数据集是只读的，当修改时间<=发布时间，允许生成pdf；如果修改时间>发布时间,就只读打开，不需要做属性映射和转pdf
	 * @return true = 直接打開caxa || false = 重新生成pdf
	 */
	private boolean isCaxaDatasetRegen(Dataset caxaDataset, boolean openDirect) {
		try {
			List<ModelObject> whereReference = TcUtils.getWhereReference(new WorkspaceObject[] {caxaDataset});
			System.out.println();
			
//			TCComponentItemRevision rev = (TCComponentItemRevision) caxaDataset.getReferenceProperty("item_revision");
//			if (!caxaDataset.okToModify()) {
//				if (debug)
//					System.out.println("只读======");
//				boolean isReleased  = caxaDataset.getProperty("release_status_list").length()==0?false:true;
//				if (!isReleased) {
//					//无发布状态
//					openDirect = true;
//				
//				} else {
//					
//					if (debug)
//						System.out.println("判断发布时间");
//					Date date_released = caxaDataset.getTCProperty("date_released").getDateValue();
//					Date last_mod_date = caxaDataset.getTCProperty("last_mod_date").getDateValue();
//					// 计算两个时间之间的分钟数差异
//					long diffMinutes = Math.abs((last_mod_date.getTime() - date_released.getTime()) / (60 * 1000));
//					if (diffMinutes < 2) {
//						if (debug)
//							System.out.println("修改时间和发布时间的时间差在2分钟以内,生成PDF");
//						openDirect = false;
//					} else {
//						if (debug)
//							System.out.println("修改时间和发布时间的时间差在2分钟以上,不生成PDF");
//						
//						Map<String, String> ecnValueMap = getECNValueMap(rev);
//						
//						if(ecnValueMap.size() != 0) {
//							openDirect = false;
//						}else {
//							openDirect = true;
//						}
//					}
//				}
//				try {
//					//在流程中允许转PDF
//
//					String[] properties = session.getPropertyService().getProperties(rev, new String[] {"fnd0InProcess"});
//
//					if(properties.length != 0 && properties[0]!=null && "true".equals(properties[0])) {
//						openDirect = false;
//					}
//						
//					System.out.println(1);
//				} catch (Exception e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//
//			} else {
//				if (debug)
//					System.out.println("可写======");
//				openDirect = false;
//			}		
//		
//		
//			if(openDirect) {				
//				System.out.println("是否直接打开图纸最终判断结果=True");
//			}else {
//				System.out.println("否直接打开图纸最终判断结果=False");
//			}
//			//特别逻辑：根据TC首选项，HX_SignCAXAByChoice,确认用户强制转换
//	
//			String forceOpenDirect = TcUtils.getTCPreference("HX_SignCAXAByChoice", session,TCPreferenceService.TC_preference_user);
//			if (!forceOpenDirect.isEmpty()) {
//				if (forceOpenDirect.equals("true")) {
//					System.out.println("强制设置执行签字图纸结果:True");
//					openDirect = false;
//				} else if (forceOpenDirect.equals("false")) {
//					System.out.println("强制设置执行签字图纸结果:False");
//					openDirect = true;
//				} else {
//					System.out.println("强制设置执行签字图纸结果:忽略");
//				}
//			}
//			
//			//2023/05/26 HXC工装图不转PDF
//			if(rev!=null) {
//				if("HXC".equals(FTPUtils.CompanyName) && "Hxc8gztuzhiRevision".equals(rev.getType())) {
//					openDirect = true;
//				}
//			}else{
//				openDirect = true;
//			}
		} catch (Exception e) {
			e.printStackTrace();
//			MessageBox.post("Teamcenter异常："+e.getMessage(), "", MessageBox.ERROR);
		} 
		return openDirect;
	}
//
//	private Map<String, String> getECNValueMap(TCComponent rev) throws TCException {
//		// 2019.11.25增加4个属性映射：更改版次（版本号）、更改文件号（更改通知单的编号）、签字（“资料管理员”）和日期（更改通知单创建日期：年月日）
//		// 只保留最近一次更改记录
//		String dateString = "";
//		Map<String, String> valueMap = new HashMap<String,String>();
//		AIFComponentContext[] ecr = rev.whereReferenced();
//		for (int i = 0; i < ecr.length; i++) {
//			TCComponent ecrRev = (TCComponent) ecr[i].getComponent();
//			System.out.println("ecrRev.getProperty:" + ecrRev.getProperty("object_type"));
//			if (ecrRev.getProperty("object_type").equals("GCGGTZD Revision")) {
//				// 必须发布
//				if (ecrRev.getProperty("release_status_list").length() > 0) {
//					String dateString2 = ecrRev.getProperty("creation_date");
//					String revType = rev.getProperty("object_type");
//					System.out.println("revType:" + revType);
//					if (dateString.length() == 0) {
//						dateString = dateString2;
//						if (revType.equals("ZPT Revision") || revType.equals("LJT Revision")
//								|| revType.equals("WXT Revision")) {
//
//							valueMap.put("更改版次1", rev.getProperty("item_revision_id"));
//							valueMap.put("更改文件名1", ecrRev.getProperty("item_id"));
//							valueMap.put("签字1", "资料管理员");
//							valueMap.put("日期1", ecrRev.getProperty("creation_date").split(" ")[0]);
//						} else if (revType.equals("GYT Revision")) {
//							valueMap.put("更改版次", rev.getProperty("item_revision_id"));
//							valueMap.put("更改文件号", ecrRev.getProperty("item_id"));
//							valueMap.put("签字", "资料管理员");
//							valueMap.put("日期", ecrRev.getProperty("creation_date").split(" ")[0]);
//
//						}
//					} else {
//						if (dateString.compareTo(dateString2) < 0) {
//							dateString = dateString2;
//							if (revType.equals("ZPT Revision") || revType.equals("LJT Revision")
//									|| revType.equals("WXT Revision")) {
//
//								valueMap.put("更改版次1", rev.getProperty("item_revision_id"));
//								valueMap.put("更改文件名1", ecrRev.getProperty("item_id"));
//								valueMap.put("签字1", "资料管理员");
//								valueMap.put("日期1", ecrRev.getProperty("creation_date").split(" ")[0]);
//							} else if (revType.equals("GYT Revision")) {
//								valueMap.put("更改版次", rev.getProperty("item_revision_id"));
//								valueMap.put("更改文件号", ecrRev.getProperty("item_id"));
//								valueMap.put("签字", "资料管理员");
//								valueMap.put("日期", ecrRev.getProperty("creation_date").split(" ")[0]);
//
//							}
//						}
//					}
//				}
//
//			}
//		}
//		return valueMap;
//		
//	}
//
//	// 获取配置中等待pdf转换超时的时间
//	private void loadWaitPdf() {
//		Properties properties = new Properties();
//		InputStream is = null;
//		is = getClass().getResourceAsStream("PDFInfo.properties");
//		try {
//			properties.load(is);
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//			MessageBox.post("PDFInfo.properties 读取异常："+e.getMessage(), "", MessageBox.ERROR);
//		}
//		waitPdf = Integer.valueOf(properties.getProperty("WAITPDF"));
//	}
//
//	/**
//	 * 等待文件下载
//	 * @param file 
//	 */
//	public void second(File file) {
//		if (!file.exists()) {
//			System.out.println("second");
//			try {
//				Thread.sleep(200);
//				second(file);
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//				MessageBox.post("异常："+e.getMessage(), "", MessageBox.ERROR);
//			}
//		} else {
//			System.out.println("cunzai");
//			try {
//				Thread.sleep(200);
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//				MessageBox.post("异常："+e.getMessage(), "", MessageBox.ERROR);
//			}
//		}
//	}
//
//	
//	/**
//	 * 构建xml映射配置文件
//	 * @param caxaDataset 
//	 * @param tcp 
//	 * @param xmlName
//	 * @return
//	 * @throws Exception
//	 */
//	public boolean hx_SetCAXAFile2(TCComponentDataset caxaDataset, TCPreferenceService tcp, String xmlName)
//			throws Exception {
//		TCComponentItemRevision rev = (TCComponentItemRevision) caxaDataset.getReferenceProperty("item_revision");
//		TCComponentForm revForm = (TCComponentForm) (rev.getReferenceListProperty("IMAN_master_form_rev"))[0];
//		TCComponentItem item = rev.getItem();
//		if (caxaDataset == null || rev == null || revForm == null || rev == null || item == null || refValues == null
//				|| refValues.length == 0) {
//			return false;
//		}
//		File file = new File(System.getenv("TEMP") + "\\" + xmlName + ".xml");
//		Map<String, String> valueMap = new HashMap<String, String>();
//		String propName;
//		int index;
//		for (String refValue : refValues) {
//			String[] valueS = refValue.split("=");
//
//			String value = null;
//			if (valueS == null || valueS.length != 2) {
//				continue;
//			}
//			String[] propNameS = valueS[1].split("\\.");
//			if (propNameS == null || propNameS.length != 2) {
//				continue;
//			}
//			index = valueS[0].indexOf(':');
//			propName = valueS[0].substring(index + 1).trim();
//			switch (propNameS[0].toUpperCase()) {
//			case "ITEM":
//				value = TcUtils.hx_GetProp(item, propNameS[1]);
//
//				break;
//			case "REV":
//				value = TcUtils.hx_GetProp(rev, propNameS[1]);
//				break;
//			case "REVMASTER":
//				value = TcUtils.hx_GetProp(revForm, propNameS[1]);
//				break;
//			case "ITEMMASTER":
//				break;
//			default:
//				break;
//			}
//			if (value == null || (valueMap.containsKey(propName) && value.length() == 0))
//				continue;
//			valueMap.put(propName, value);
//		}
//		if (valueMap.size() != 0) {
//			writeDoc(valueMap, file, xmlName);
//			return true;
//		}else {
//			return false;
//		}
//		
//
//	}
//
//	
//	
//	
//
//	public void replaceOrcreate(TCComponentDataset arg0, TCComponentItemRevision rev, TCSession session,
//			String addPdfPath) throws Exception {
//		// 判断版本下有无pdf数据集，并且名称和caxa相同，有就替换，没有就新建
//		TCComponentDataset dataset = null;
//		TCComponent[] datasets = (TCComponent[]) rev.getTCProperty("IMAN_specification").getReferenceValueArray();
////		datasets=(TCComponent[]) tempRev.getTCProperty("TC_Attaches").getReferenceValueArray();
//			String pdfName = "";
//			String caxaName = "";
//			for (int i = 0; i < datasets.length; i++) {
//				if (datasets[i].getProperty("object_type").equals("PDF")) {
//					pdfName = datasets[i].getProperty("object_name");
//					caxaName = arg0.getProperty("object_name");
//					if (pdfName.contains(".pdf") && caxaName.contains(".exb")) {
//						pdfName = pdfName.substring(0, pdfName.lastIndexOf(".pdf"));
////						System.out.println(pdfName);
//						caxaName = caxaName.substring(0, caxaName.lastIndexOf(".exb"));
////						System.out.println(pdfName);
//					}
//				}
//				if (datasets[i].getProperty("object_type").equals("PDF") && caxaName.equals(pdfName)) {
//					dataset = (TCComponentDataset) datasets[i];
//				}
//			}
//
//		if (dataset == null) {
//			
//			
//			try {
//				TCComponentDatasetType datasetType = (TCComponentDatasetType) session.getTypeComponent("Dataset");
//				dataset = datasetType.create(arg0.getProperty("object_name").replace(".exb", ".pdf"), "", "PDF");
//				rev.add("IMAN_specification", dataset);
//			} catch (TCException e) {
//				e.printStackTrace();
//				ChangeDbomUtil.setByPass(false);
//				MessageBox.post("Teamcenter异常："+e.getMessage(), "", MessageBox.ERROR);
//				 
//			}
//		 
//		}
//		if (dataset == null) {
//			MessageBox.post("创建失败", "错误", MessageBox.ERROR);
//		}
//		try {
//			dataset.setFiles(new String[] { addPdfPath }, new String[] { "PDF_Reference" });
//			dataset.save();
//			arg0.setProperty("object_desc", "转换时间："+new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()));
//		} catch (Exception e) {
//			TCComponentItemRevision tempRev = null;
//			// 获得当前数据集所在版本对象
//			try {
//				tempRev = (TCComponentItemRevision) dataset.getReferenceProperty("item_revision");
//			
//			//String message = tempRev.getProperty("object_string") + "PDF图纸命名应用替换失败，请联系管理员";
//			//修复问题：打开只读模式的图纸或者数据集中的表单，会跳出显示错误异常。by Jimmy
//			//ifError(tempRev, message);
//				System.out.println("替换pdf失败，关旁路");
//			} catch (TCException e1) {
//				ChangeDbomUtil.setByPass(false);
//				e1.printStackTrace();
//				MessageBox.post("Teamcenter异常："+e1.getMessage(), "", MessageBox.ERROR);
//			}
//		}
//
//		ChangeDbomUtil.setByPass(false);
//	 
//
//	}
//
//	
//	
//	
//	
//
//	/**
//	 * 获取PDF的尺寸和图框的匹配并返回需要插入图片的位置
//	 * 
//	 * @param rectangle
//	 * @return
//	 */
//	public Float[] getSize(Rectangle rectangle) {
//		Float[] sizef = new Float[2];
//		float toleft = rectangle.getLeft();
//		float tobottom = rectangle.getBottom();
//		float toright = rectangle.getRight();
//		float totop = rectangle.getTop();
//
//		JFomPdfBean bean = new JFomPdfBean();
//		bean.setH(toright - toleft);// PDF的宽
//		bean.setW(totop - tobottom);// PDF的高
//		sizef[0] = bean.getH();
//		sizef[1] = bean.getW();
//		System.out.println("bean.getH------------>" + bean.getH());
//		System.out.println("bean.getW------------>" + bean.getW());
//
//		return sizef;
//	}
//
//	public String[] selectType(String Ax, String designType) {
//		String[] type = null;
//		switch (designType) {
//
//		case "HX3_GYTRevision":// 工艺图
//			if (Ax.equals("A3")) {
//				type = new String[1];
//				type[0] = Ax + "_GY";
//			} else if (Ax.equals("A2")) {
//				type = new String[2];
//				type[0] = Ax + "_GY1";
//				type[1] = Ax + "_GY2";
//			}
//			break;
//		case "HX3_TYGY1Revision":// 通用工艺
//			if (Ax.equals("A3")) {
//				type = new String[1];
//				type[0] = Ax + "_TYGY";
//			} else if (Ax.equals("A2")) {
//				type = new String[2];
//				type[0] = Ax + "_TYGY1";
//				type[1] = Ax + "_TYGY2";
//			}
//			break;
//		case "HX3_WXTRevision":// 产品图：外协加工图HX3_WXTRevision ，零件图HX3_LJTRevision 装配图HX3_ZPTRevision
//			type = new String[1];
//			type[0] = Ax + "_PRODUCT";
//			break;
//		case "HX3_DJTRevision":// 产品图：外协加工图HX3_WXTRevision ，零件图HX3_LJTRevision
//								// 装配图HX3_ZPTRevision，锻件图HX3_DJTRevision
//			type = new String[1];
//			type[0] = Ax + "_PRODUCT";
//			break;
//		case "HX3_LJTRevision":// 产品图：外协加工图HX3_WXTRevision ，零件图HX3_LJTRevision 装配图HX3_ZPTRevision
//			type = new String[1];
//			type[0] = Ax + "_PRODUCT";
//			break;
//		case "HX3_ZPTRevision":// 产品图：外协加工图HX3_WXTRevision ，零件图HX3_LJTRevision 装配图HX3_ZPTRevision
//			type = new String[1];
//			type[0] = Ax + "_PRODUCT";
//			break;
//		case "HX3_GCGGTZDRevision":// 工程更改通知单
//			type = new String[1];
//			type[0] = Ax + "_ECN";
//			break;
//		case "HX3_GZTRevision":// 工装图
//			type = new String[2];
//			type[0] = Ax + "_GZT1";
//			type[1] = Ax + "_GZT2";
//			break;
//		default:
//			break;
//		}
//
//		return type;
//	}
//
//	public Image[] setPic(Image[] img, String[] sizeType, Properties properties, String markImagePath)
//			throws BadElementException, MalformedURLException, IOException {
//		// 转成String路径
//		img = new Image[sizeType.length];
//		for (int k = 0; k < sizeType.length; k++) {
//
//			img[k] = Image.getInstance(markImagePath);// 获取图片实例
//			String str = properties.getProperty(sizeType[k]);
//			if (str == null) {
//				img[k].setAbsolutePosition(Float.valueOf(10), Float.valueOf(10));
//			} else {
//
//				String[] values = str.split(",");
//				img[k].setAbsolutePosition(Float.valueOf(values[0]), Float.valueOf(values[1]));// 设置水印左下角的坐标
//			}
//		}
//		return img;
//	}
//
//	public void addPdfMark(String InPdfFile, String temp, String[] markImagePath, String designType) throws Exception {
//		boolean isModel = true;
//		File pdffile = new File(temp);
//		if (pdffile.exists()) {
//			pdffile.delete();
//		}
//		// 插入坐标
//		Properties properties = new Properties();
//		InputStream is = null;
//		is = getClass().getResourceAsStream("PDFInfo.properties");
//		properties.load(is);
//
//		// PDF 输入文件
//		PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
//		// PDF 输出文件
//		PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(temp));
//		// 水印图片
//		Image[] img = null;
//		for (int j = 0; j < markImagePath.length; j++) {
////			img.scaleAbsolute(35, 20);// 缩放图片
////			float imgW = img.getScaledWidth();// 获取图片的宽度
////			float imgH = img.getScaledHeight();// 获取图片的高度
//			// 获取PDF的页数
//			int pageSize = reader.getNumberOfPages();// 获取输入文件的页数
//			for (int i = 1; i <= pageSize; i++) {
//				Rectangle rectangle = reader.getPageSize(i);
//				Float[] fposition = getSize(rectangle);
//				System.out.println("fposition[0]=======" + fposition[0]);
//				System.out.println("fposition[1]=======" + fposition[1]);
//				boolean isSizeOk = false;
//				String[] sizeType = null;
//				// 设置水印的插入位置A0
//				if ((fposition[0] > 3300 && fposition[1] > 2300)) {
//					isSizeOk = true;
//					// 通过pdf所在的版本类型判断坐标参数
//					System.out.println("进入设置水印的插入位置A0");
//					sizeType = selectType("A0", designType);
//
//				}
//				// TODO 设置水印的插入位置A1
//				if ((fposition[0] > 2300 && fposition[1] > 1600) && isSizeOk == false) {
//					isSizeOk = true;
//					System.out.println("进入设置水印的插入位置A1");
//					sizeType = selectType("A1", designType);
//				}
//
//				// TODO 设置水印的插入位置A2
//				if ((fposition[1] > 1100 && fposition[0] > 1600) && isSizeOk == false) {
//					isSizeOk = true;
//					System.out.println("进入设置水印的插入位置A2");
//					sizeType = selectType("A2", designType);
//				}
//				// TODO 设置水印的插入位置A2
//				if ((fposition[0] > 1100 && fposition[1] > 1600) && isSizeOk == false) {
//					isSizeOk = true;
//					System.out.println("进入设置水印的插入位置A2_GY");
//					sizeType = selectType("A2", designType);
//				}
//				// TODO 设置水印的插入位置A3
//				if ((fposition[0] > 1100 && fposition[1] > 800) && isSizeOk == false) {
//					isSizeOk = true;
//					System.out.println("进入设置水印的插入位置A3");
//					sizeType = selectType("A3", designType);
//				}
//
//				// TODO 设置水印的插入位置A3 竖版
//				if ((fposition[1] > 1100 && fposition[0] > 800) && isSizeOk == false) {
//					isSizeOk = true;
//					System.out.println("进入设置水印的插入位置A3H");
//					sizeType = selectType("A3H", designType);
//				}
//				
//				// TODO 设置水印的插入位置A4
//				if ((fposition[1] > 800 && fposition[0] > 500) && isSizeOk == false) {
//					isSizeOk = true;
//					System.out.println("进入设置水印的插入位置A4");
//					sizeType = selectType("A4", designType);
//				}
//				
//				// 设置水印的插入位置A4 横版
//				if ((fposition[0] > 800 && fposition[1] > 500) && isSizeOk == false) {
//					isSizeOk = true;
//					System.out.println("进入设置水印的插入位置A4H ");
//					sizeType = selectType("A4H", designType);
//				}
//				if (sizeType != null) {
//
//					img = setPic(img, sizeType, properties, markImagePath[j]);
//				}
//				if (img == null || sizeType == null) {
//					img = new Image[1];
//					img[0] = Image.getInstance(markImagePath[j]);// 获取图片实例
//					img[0].setAbsolutePosition(Float.valueOf(10), Float.valueOf(10));
//					/*
//					 * isModel=false; continue;
//					 */
//				}
//				// 向PDF输出文件中插入水印
//				PdfContentByte under = stamp.getOverContent(i);// stamp.getUnderContent(i);
//				PdfGState gs = new PdfGState();
//				gs.setFillOpacity(1.0f);// 设置透明度为0.2
//				under.setGState(gs);
//				for (int k = 0; k < img.length; k++) {
//					under.addImage(img[k]);
//
//				}
//			}
//		}
//		stamp.close();// 关闭
//		reader.close();// 关闭
//		File tempfile = new File(InPdfFile);
//		if (tempfile.exists() && isModel == true) {
//			// 删除原文件
//			tempfile.delete();
//		}
//
//	}
//
//	
//	
//	
//	
//
//	
//	
//	
//	
//
//
//	
//
//	
//
//
//
//	/**
//	 * 判断数据集是否为模板文件
//	 * @param tccomponentdataset
//	 * @return
//	 */
//	public int judgeModel(TCComponentDataset tccomponentdataset) {
//		// 先判断是不是木板库中文件，如果是就退出
//		long start1 = System.currentTimeMillis();
//		try {
//			TCComponentItemRevision rev = (TCComponentItemRevision) tccomponentdataset
//					.getReferenceProperty("item_revision");
//			if (rev != null) {
//				TCComponentItem item = rev.getItem();
//				AIFComponentContext[] folders = item.whereReferenced();
//				if (folders.length == 1) {
//					if (folders[0].getComponent() instanceof TCComponentFolder) {
//
//						TCComponentFolder folder = (TCComponentFolder) folders[0].getComponent();
//						AIFComponentContext[] folders2 = folder.whereReferenced();
//						if (folders2.length == 1) {
//							if (folders2[0].getComponent() instanceof TCComponentFolder) {
//								TCComponentFolder folder2 = (TCComponentFolder) folders2[0].getComponent();
//								String name = folder2.getProperty("object_name");
//								if (name.equals("图纸模板库")) {
//									return 1;
//								}
//							}
//						}
//					}
//				}
//			} else {
//				return 0;
//			}
//		} catch (TCException e1) {
//			e1.printStackTrace();
//			MessageBox.post("Teamcenter异常："+e1.getMessage(), "", MessageBox.ERROR);
//		} //
//		long now1 = System.currentTimeMillis();
//		float time1 = (now1 - start1) / 1000.00f;
//		System.out.println("judgeModel已耗时" + time1 + "秒");
//		return 0;
//	}
//
//	
//
//
//	
//	/**
//	 * 处理宏协的CAXA数据集打开前操作
//	 * 
//	 * @param caxaDataset
//	 * @throws Exception 
//	 */
//	public void hx_SetCAXAFileOrigin(TCComponentDataset caxaDataset, TCPreferenceService tcp, String type,boolean openDirect)
//			throws Exception {
//		long start1 = System.currentTimeMillis();
//		
//		// 获得当前数据集所在版本对象、版本表单、对象
//		TCComponentItemRevision rev = (TCComponentItemRevision) caxaDataset.getReferenceProperty("item_revision");
//		System.out.println("关联的-----------" + rev.getProperty("object_string"));
//		TCComponentForm revForm = (TCComponentForm) (rev.getReferenceListProperty("IMAN_master_form_rev"))[0];
//		TCComponentItem item = rev.getItem();
//		// 获取caxa文件
//		File file = TcUtils.getCaxaDatasetFile(caxaDataset);
//		if (rev == null || revForm == null || item == null || file == null || refValues == null
//				|| refValues.length == 0) {
//			return;
//		}
//
//		Map<String, String> valueMap = getValueMap(item, rev, revForm, openDirect);
//		if (valueMap.size() != 0) {
//			writeDoc(valueMap, file,null);
//		} 
//		long now1 = System.currentTimeMillis();
//		float time1 = (now1 - start1) / 1000.00f;
//		System.out.println("hx_SetCAXAFile已耗时" + time1 + "秒");
//	}
//
//
//
//	private Map<String, String> getValueMap(TCComponent item,TCComponent rev,TCComponent revForm,boolean openDirect ) throws TCException {
//		Map<String, String> valueMap = new HashMap<String,String>();
//		StringBuffer infoSB = new StringBuffer();
//		String propName;
//		int index;
//		for (String refValue : refValues) {
//			String[] valueS = refValue.split("=");
//
//			String value = null;
//			if (valueS == null || valueS.length != 2) {
//				continue;
//			}
//			String[] propNameS = valueS[1].split("\\.");
//			if (propNameS == null || propNameS.length != 2) {
//				continue;
//			}
//			index = valueS[0].indexOf(':');
//			propName = valueS[0].substring(index + 1).trim();
//			switch (propNameS[0].toUpperCase()) {
//			case "ITEM":
//				value = TcUtils.hx_GetProp(item, propNameS[1]);
//				break;
//			case "REV":
//				value = TcUtils.hx_GetProp(rev, propNameS[1]);
//				break;
//			case "REVMASTER":
//				value = TcUtils.hx_GetProp(revForm, propNameS[1]);
//				break;
//			case "ITEMMASTER":
//				break;
//			default:
//				break;
//			}
//			if (value == null || (valueMap.containsKey(propName) && value.length() == 0))
//				continue;
//			valueMap.put(propName, value);
//			infoSB.append(valueS[0]).append("=").append(value).append("|");
//		}
//		Map<String, String> ecnValueMap = getECNValueMap(rev);
//		for(String ecnValueSet :ecnValueMap.keySet()) {
//			valueMap.put(ecnValueSet, ecnValueMap.get(ecnValueSet));
//		}
//		
//		valueMap.put("是否更新签字",openDirect==true?"否":"是");
//		System.out.println("valueMap:" + valueMap);
//		return valueMap;
//	}
//
//	
//
//	/**
//	 * 写入映射文件
//	 * @param valueMap 映射属性集
//	 * @param file xml映射文件
//	 * @throws Exception
//	 */
//	private void writeDoc(Map<String,String> valueMap,File file,String caxaFileName) throws Exception {
//		SAXReader reader = new SAXReader();
//		Document doc = reader.read(new File(exePath + "sign.xml"));
//		Element root = doc.getRootElement();
//		Element title = root.element("SignInfo").element("Title");
//		Element files = root.element("SignInfo").element("Files").element("File");
//		if(caxaFileName != null) {
//			files.attribute("Path").setValue(FTPUtils.ftpPath +"\\"+ caxaFileName + ".exb");
//		}
//		Element e;
//		Iterator it = title.elementIterator();
//		while (it.hasNext()) {
//			e = (Element) it.next();
//			String val = valueMap.get(e.attribute("Name").getValue());
//			if(debug)System.out.println("name:" + e.attribute("Name").getValue());
//			if(debug)System.out.println("val:" + val);
//			if (val != null)
//				e.attribute("Value").setValue(val);
//		}
//		PrintWriter pw = new PrintWriter(file, "UTF-8");
//		doc.write(pw);
//		pw.close();
//		System.out.println("222");
//
//	}
//
//
//	
//	
//
//	public void openCad() {
//		
//		String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
////		System.out.println("包内路径-----------------"+path);
//		String exePath = path.substring(1, path.indexOf("com.connor.signoff")).replace("/", "\\");
//		exePath = exePath + "CADregedit.bat";
//		File file = new File(exePath);
//
//		if (file != null && file.exists()) {
//			System.out.println("执行打开CAXA集成工具注册表修改:"+ exePath);
//			Runtime rn = Runtime.getRuntime();
//			Process p = null;
//			try {
//				System.out.println("CALL CMD:" + exePath);
//				p = rn.exec("cmd /c \"" + exePath + "\"");
//				p.waitFor();
//				//替换为管理员身份运行
//				//String command = "cmd /c start /wait runas /user:Administrator \"cmd /c \"" + exePath + "\"\"";
//				//Runtime.getRuntime().exec(command);
//			} catch (Exception e) {
//				e.printStackTrace();
//				System.out.println("Error exec!");
//			}
//		} else {
//			System.out.println("不存在" + exePath + "文件");
//		}
//		
//		
//	}

	

}
