package com.vci.client.omd.provider; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.vci.corba.omd.atm.AttPoolServicePrx; import com.vci.corba.omd.atm.AttribItem; import com.vci.corba.omd.etm.EnumItem; import com.vci.client.common.ClientLog4j; import com.vci.client.common.providers.ServiceProvider; import com.vci.corba.common.VCIError; import com.vci.omd.constants.OmdConstants; import com.vci.omd.dataType.VTDataType; import com.vci.omd.objects.OtherInfo; public class ApProvider { private static ApProvider apProvider = null; private ApProvider(){ } public static ApProvider getInstance(){ if(apProvider == null){ apProvider = new ApProvider(); } return apProvider; } private static AttPoolServicePrx getService(){ try { return ServiceProvider.getOMDService().getAttributeService(); } catch (Exception e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } return null; } /** * 根据多个属性名获取多个属性 * @param abNames * @return */ public static AttribItem[] getAttribItemsByNames(String[] abNames){ AttribItem[] attribItems = null; try { attribItems = getService().getAttribItemsByNames(abNames); } catch (VCIError e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } if(attribItems == null){ attribItems = new AttribItem[0]; } return attribItems; } /** * 获取指定的属性 * @param abName * @return */ public static AttribItem getAbItemByName(String abName){ AttribItem abItem = null; try { abItem = getService().getAttribItemByName(abName); } catch (VCIError e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } return abItem; } /** * 获取全部属性 * @return */ public static AttribItem[] getAllAbItems(){ AttribItem[] abArray = null; try { abArray = getService().getAttribItems("", 1, 1); } catch (VCIError e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } return abArray; } /** * 获取属性的数据类型 * @param abName * @return */ public static String getAbItemDataType(String abName){ String dataType = null; String abUpperName = abName.toUpperCase(); //系统属性 if(abUpperName.equals("OID") || abUpperName.equals("REVISIONOID") || abUpperName.equals("NAMEOID") || abUpperName.equals("BTMNAME") || abUpperName.equals("CREATOR") || abUpperName.equals("LASTMODIFIER") || abUpperName.equals("REVISIONRULE") || abUpperName.equals("VERSIONRULE") || abUpperName.equals("REVISIONVALUE") || abUpperName.equals("VERSIONVALUE") || abUpperName.equals("LCTID") || abUpperName.equals("LCSTATUS") || abUpperName.equals("ID") || abUpperName.equals("NAME") || abUpperName.equals("DESCRIPTION") || abUpperName.equals("OWNER") || abUpperName.equals("CHECKINBY") || abUpperName.equals("CHECKOUTBY") || abUpperName.equals("COPYFROMVERSION") || abUpperName.equals("ISLASTR") || abUpperName.equals("ISFIRSTR") || abUpperName.equals("ISLASTV") || abUpperName.equals("ISFIRSTV") || abUpperName.equals("F_OID") || abUpperName.equals("F_REVISIONOID") || abUpperName.equals("F_NAMEOID") || abUpperName.equals("F_BTWNAME") || abUpperName.equals("T_OID") || abUpperName.equals("T_REVISIONOID") || abUpperName.equals("T_NAMEOID") || abUpperName.equals("T_BTWNAME")){ dataType = "VTString"; }else if(abUpperName.equals("REVISIONSEQ") || abUpperName.equals("VERSIONSEQ")){ dataType = "VTInteger"; }else if(abUpperName.equals("CREATETIME") || abUpperName.equals("LASTMODIFYTIME") || abUpperName.equals("TS") || abUpperName.equals("CHECKINTIME") || abUpperName.equals("CHECKOUTTIME")){ dataType = "VTDateTime"; //属性池中属性 }else{ try { dataType = getService().getAttribItemDataType(abName); } catch (VCIError e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } } return dataType; } /** * 提供(对外)属性池的数据文件数据 * @return */ public static String getAPData(){ String content = ""; try { content = getService().getAPData(); } catch (VCIError e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } return content; } /** * 获取other中指定项目的值 * @return */ public static String getOtherValueByType(String other, String type){ String[] otherArray = other.split(";"); for(int i = 0; i < otherArray.length; i++){ String otherValue = otherArray[i]; if(otherValue.contains(type)){ return otherValue.substring(otherValue.indexOf("=") + 2, otherValue.length()); } } return null; } /** * 检查属性类型与属性值是否匹配 * @param vtType * @param value * @return */ public static boolean checkDataType(String vtType, String value){ if(vtType.equals(VTDataType.VTSTRING)){ try{ String.valueOf(value); }catch(Exception e){ return false; } }else if(vtType.equals(VTDataType.VTINTEGER)){ try{ Integer.valueOf(value); }catch(Exception e){ return false; } }else if(vtType.equals(VTDataType.VTLONG)){ try{ Long.valueOf(value); }catch(Exception e){ return false; } }else if(vtType.equals(VTDataType.VTDOUBLE)){ try{ Double.valueOf(value); }catch(Exception e){ return false; } } return true; } public static boolean expData(String dir, AttribItem[] objs) { Set enumNames = new HashSet(); List enums = new ArrayList(); BufferedWriter bw = null; FileOutputStream fos = null; OutputStreamWriter osw =null; try{ File file = new File(dir + "/att.txt"); //将clob字段写到单独的文件中 if(!file.exists()){ new File(dir + "/att").mkdir(); } //add by caill start 2015.12.23 导出时将txt文件设置为“utf-8”格式 fos = new FileOutputStream(file,true); osw = new OutputStreamWriter(fos, "utf-8"); bw = new BufferedWriter(osw); //add by caill end //w = new FileWriter(file, true); //bw = new BufferedWriter(w); for(AttribItem o : objs){ OtherInfo otherInfo = OtherInfo.getOtherInfoByText(o.other); String enumName = otherInfo.getEnumName(); if(enumName != null && !enumName.equals("")){ enumNames.add(enumName); } //若str小于缓冲区大小, 将写到缓冲区; //若str大于缓冲区大小, 将刷新缓冲区(将缓冲区内容写到底层流), 然后str直接写到底层流. String text = getObjectText(o); bw.write(text); bw.newLine(); BufferedWriter clobBW = null; FileOutputStream fo = null; OutputStreamWriter pw =null; try{ File clobFile = new File(dir + "/att/" + o.oid + ".xml"); //add by caill start 2015.12.23 将xml内容和xml文件格式统一 fo = new FileOutputStream(clobFile); pw = new OutputStreamWriter(fo, "utf-8"); clobBW = new BufferedWriter(pw); clobBW.write( "");//gb2312 clobBW.write(getXmlText(o)); clobBW.flush(); //add by caill end }catch(IOException e2){ e2.printStackTrace(); }finally{ try{ if(clobBW != null){ fo.close(); //add by caill 2015.12.16 将fo关闭 pw.close(); //add by caill 2015.12.16 将pw关闭 clobBW.close(); } } catch (IOException e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } } } bw.flush(); for(String name : enumNames){ EnumItem emItem = EnumProvider.getInstance().getService().getEmItemByName(name); enums.add(emItem); } boolean flag = EnumProvider.getInstance().expData(dir, enums.toArray(new EnumItem[0])); ClientLog4j.logger.info("**************属性池导出成功************"); return true & flag; }catch(IOException e){ //e.printStackTrace(); ClientLog4j.logger.error(e); } catch (VCIError e) { //e.printStackTrace(); ClientLog4j.logger.error(e); }finally{ try { if(bw != null){ fos.close(); //add by caill 2015.12.23 将fos关闭 osw.close(); //add by caill 2015.12.23 将osw关闭 bw.close(); } } catch (IOException e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } } ClientLog4j.logger.warn("**************属性池导出失败************"); return false; } /** * 将对象转化成字符串 * {oid:qqq, name:q} * @param o * @return */ public static String getObjectText(AttribItem o) { StringBuilder stb = new StringBuilder("{"); stb.append(OmdConstants.OID + ":" + o.oid + ","); stb.append(OmdConstants.NAME + ":" + o.name + ","); stb.append(OmdConstants.LABEL + ":" + o.label + ","); stb.append(OmdConstants.DESCRIPTION + ":" + o.description + ","); stb.append(OmdConstants.TS + ":" + o.ts + ","); stb.append(OmdConstants.CREATOR + ":" + o.creator + ","); stb.append(OmdConstants.CREATETIME + ":" + o.createTime + ","); stb.append(OmdConstants.MODIFIER + ":" + o.modifier + ","); stb.append(OmdConstants.MODIFYTIME + ":" + o.modifyTime); stb.append("}"); return stb.toString(); } /** * 将att转化成xmltext * @param bt * @return */ public static String getXmlText(AttribItem att) { StringBuilder stb = new StringBuilder(""); stb.append("" + att.name + ""); stb.append(""); stb.append("" + att.description + ""); stb.append("" + att.vtDataType + ""); stb.append("" + att.defValue + ""); stb.append("" + att.rage + ""); stb.append("" + att.other + ""); stb.append(""); return stb.toString(); } public static List getAttFromFile(String dir) { File file = new File(dir + "/att.txt"); List list = new ArrayList(); BufferedReader br = null; FileInputStream fo = null; InputStreamReader isw =null; try { /*r = new FileReader(file); br = new BufferedReader(r);*/ //add by caill start 2015.12.23 导入时将txt文件内容设置为“utf-8”格式 fo = new FileInputStream(file); isw = new InputStreamReader(fo, "utf-8"); br = new BufferedReader(isw); //add by caill end String str = null; while((str = br.readLine()) != null){ Map map = getMapFormText(str); String oid = map.get("oid"); if(oid != null && !oid.equals("")){ File contentFile = new File(dir + "/att/" + oid + ".xml"); if(!contentFile.exists()){ ClientLog4j.logger.info(dir + "/att/" + oid + ".xml不存在"); break; } AttribItem att = new AttribItem(); att.oid = oid; att.name = map.get("name"); att.label = map.get("label"); att.description = map.get("description"); att.ts = map.get("ts"); att.creator = map.get("creator"); att.createTime = Long.valueOf(map.get("createTime")); att.modifier = map.get("modifier"); att.modifyTime = Long.valueOf(map.get("modifyTime")); SAXReader sa = new SAXReader(); //add by caill 2015.12.23 导入时将saxReader对象设置为“utf-8”格式 sa.setEncoding("utf-8"); Document document = sa.read(contentFile); setAttValueFormDoc(att, document.getRootElement()); list.add(att); }else{ ClientLog4j.logger.info(dir + "att.txt中存在oid为空的错误记录"); break; } } return list; } catch (FileNotFoundException e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } catch (IOException e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } catch (DocumentException e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } finally{ if(br != null){ try { fo.close(); //add by caill 2015.12.23 将fo关闭 isw.close(); //add by caill 2015.12.23 将isw关闭 br.close(); } catch (IOException e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } } } return null; } /** * 将文件中一条记录解析成key-value * @param str * @return */ public static Map getMapFormText(String str) { str = str.trim(); if(!str.startsWith("{") || !str.endsWith("}")){ return null; } Map map = new HashMap(); str = str.substring(1, str.length() - 1); String[] kvs = str.split(","); for(String kv : kvs){ String[] kv_ = kv.split(":"); if(kv_.length == 1){ map.put(kv_[0].trim(), ""); }else{ map.put(kv_[0].trim(), kv_[1].trim()); } } return map; } /** * 设置EnumItem存在 * @param att * @param element */ private static void setAttValueFormDoc(AttribItem att, Element element){ String value = element.elementText("vtDataType"); att.vtDataType = (value == null ? "" : value); value = element.elementText("defValue"); att.defValue = (value == null ? "" : value); value = element.elementText("rage"); att.rage = (value == null ? "" : value); value = element.elementText("other"); att.other = (value == null ? "" : value); } public static boolean impData(String dir, AttribItem[] atts) { try { List enums = EnumProvider.getInstance().getEnumsFromFile(dir); boolean enumFlag = EnumProvider.getInstance().impData(enums.toArray(new EnumItem[0])); if(!enumFlag){ ClientLog4j.logger.info("属性池使用的枚举导入失败。导入中止。"); return false; } for(AttribItem att : atts){ AttribItem att_ = getService().getAttribItemByName(att.name); //已经存在 if(!att_.oid.equals("")){ //类型一致则覆盖 if(att.vtDataType.equals(att_.vtDataType)){ getService().deleteAbItem(att_); getService().addAttribItem(att); ClientLog4j.logger.info(att.name + "在数据库中已经存在,且类型与文件中的一致。 覆盖。"); //类型不一致则中止导入 }else{ ClientLog4j.logger.info(att.name + "在数据库中已经存在,且类型与文件中的不一致。 中止导入。"); return false; } }else{ getService().addAttribItem(att); } } return true; } catch (VCIError e) { //e.printStackTrace(); ClientLog4j.logger.error(e); } return false; } }