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.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.vci.client.common.providers.ServiceProvider; import com.vci.corba.common.VCIError; import com.vci.corba.omd.vrm.VersionRule; import com.vci.corba.omd.vrm.VersionRuleServicePrx; import com.vci.omd.constants.OmdConstants; public class VersionRuleProvider { private static VersionRuleProvider instance = null; /** * 缓存已经调用new VersionRuleProvider(); * 因此不能定义 私有的VersionRuleProvider(); * @return */ public static VersionRuleProvider getInstance(){ if(instance == null){ instance = new VersionRuleProvider(); } return instance; } /*** * * 获取所有链接类型对象数组 * */ public VersionRule [] getVersionRules(){ VersionRule[] versionRules = null; try { versionRules = getService().getVersionRules(); } catch (VCIError e) { // TODO Auto-generated catch block e.printStackTrace(); } return versionRules; } public VersionRule getVersionRuleByName(String name){ try { VersionRule[] vrs = getService().getVersionRules(); for(VersionRule vr : vrs){ if (vr.name.equals(name)) return vr; } } catch (VCIError e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public VersionRuleServicePrx getService(){ try { return ServiceProvider.getOMDService().getVerRuleService(); } catch (Exception e) { e.printStackTrace(); } return null; } public List parseArrayToList(String[] array){ List list = new ArrayList(array.length); for(String a : array){ list.add(a); } return list; } public boolean expData(String dir, VersionRule[] vrs){ //TODO调用ATT, LC, VR的导出 BufferedWriter bw = null; FileOutputStream fos = null; OutputStreamWriter osw =null; try{ File file = new File(dir + "/vr.txt"); //将clob字段写到单独的文件中 new File(dir + "/vr").mkdir(); //add by caill start 2015.12.23 导出时将txt文件设置为“utf-8”格式 fos = new FileOutputStream(file); osw = new OutputStreamWriter(fos, "utf-8"); bw = new BufferedWriter(osw); //add by caill end /*w = new FileWriter(file); bw = new BufferedWriter(w);*/ for(VersionRule vr : vrs){ //若str小于缓冲区大小, 将写到缓冲区; //若str大于缓冲区大小, 将刷新缓冲区(将缓冲区内容写到底层流), 然后str直接写到底层流. String text = getObjectText(vr); bw.write(text); bw.newLine(); BufferedWriter clobBW = null; FileOutputStream fo = null; OutputStreamWriter pw =null; try{ File clobFile = new File(dir + "/vr/" + vr.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( ""); clobBW.write(getXmlText(vr)); clobBW.flush(); //add by caill end /*clobW = new FileWriter(clobFile); clobBW = new BufferedWriter(clobW); clobBW.write( "");//gb2312 clobBW.write(getXmlText(vr)); clobBW.flush();*/ }catch(IOException e2){ e2.printStackTrace(); }finally{ try{ if(clobBW != null){ fo.close(); //add by caill 2015.12.23 将fo关闭 pw.close(); //add by caill 2015.12.23 将pw关闭 clobBW.close(); } } catch (IOException e) { e.printStackTrace(); } } } bw.flush(); System.out.println("**************版本规则导出成功************"); return true; }catch(IOException e){ e.printStackTrace(); }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(); } } System.out.println("**************版本规则导出失败************"); return false; } /** * 将对象转化成字符串 * {oid:qqq, name:q} * @param vr * @return */ public String getObjectText(VersionRule vr) { StringBuilder stb = new StringBuilder("{"); stb.append(OmdConstants.OID + ":" + vr.oid + ","); stb.append(OmdConstants.NAME + ":" + vr.name + ","); stb.append(OmdConstants.LABEL + ":" + vr.tag + ","); stb.append(OmdConstants.DESCRIPTION + ":" + vr.description + ","); stb.append(OmdConstants.TS + ":" + vr.ts + ","); stb.append(OmdConstants.CREATOR + ":" + vr.creator + ","); stb.append(OmdConstants.CREATETIME + ":" + vr.createTime + ","); stb.append(OmdConstants.MODIFIER + ":" + vr.modifier + ","); stb.append(OmdConstants.MODIFYTIME + ":" + vr.modifyTime); stb.append("}"); return stb.toString(); } /** * 将VersionRule转化成xmltext * @param bt * @return */ public String getXmlText(VersionRule vr){ StringBuilder stb = new StringBuilder(""); stb.append("" + vr.name + ""); stb.append("" + vr.tag + ""); stb.append("" + vr.jumpCharacter + ""); stb.append("" + vr.initialValue + ""); stb.append("" + vr.stepLength + ""); stb.append("" + vr.prefixion + ""); stb.append("" + vr.suffix + ""); stb.append("" + vr.description + ""); stb.append("" + vr.associated + ""); stb.append(""); return stb.toString(); } public List getVRsFromFile(String dir) { File file = new File(dir + "/vr.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 + "/vr/" + oid + ".xml"); if(!contentFile.exists()){ System.out.println(dir + "/vr/" + oid + ".xml不存在"); break; } VersionRule em = new VersionRule(); em.oid = oid; em.name = map.get("name"); em.tag = map.get("label"); em.ts = map.get("ts"); em.creator = map.get("creator"); em.createTime = Long.valueOf(map.get("createTime")); em.modifier = map.get("modifier"); em.modifyTime = Long.valueOf(map.get("modifyTime")); em.description = map.get("description"); //add aby caill 2015.12.23 原代码中没有description一项,导致导入时,“描述”一栏没有值 SAXReader sa = new SAXReader(); //add by caill 2015.12.23 导入时将saxReader对象设置为“utf-8”格式 sa.setEncoding("utf-8"); Document document = sa.read(contentFile); setVRValueFormDoc(em, document.getRootElement()); list.add(em); }else{ System.out.println(dir + "vr.txt中存在oid为空的错误记录"); break; } } return list; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } 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(); } } } return null; } /** * 将文件中一条记录解析成key-value * @param str * @return */ public 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 vr * @param element */ public void setVRValueFormDoc(VersionRule vr, Element element){ String value = element.elementText("jumpCharacter"); vr.jumpCharacter = (value == null ? "" : value); value = element.elementText("initialValue"); vr.initialValue = (value == null ? "" : value); value = element.elementText("stepLength"); vr.stepLength = (value == null ? "" : value); value = element.elementText("prefixion"); vr.prefixion = (value == null ? "" : value); value = element.elementText("suffix"); vr.suffix = (value == null ? "" : value); value = element.elementText("associated"); vr.associated = (value == null ? "" : value); } public boolean impData(VersionRule[] vrs) { try { for(VersionRule vr : vrs){ VersionRule vr_ = getService().getVersionRule(vr.name); //已经存在 if(!vr_.oid.equals("")){ getService().deleteVersionRule(vr_); getService().addVersionRule(vr); System.out.println(vr.name + "在数据库中已经存在, 覆盖。"); }else{ getService().addVersionRule(vr); } } return true; } catch (VCIError e) { e.printStackTrace(); } return false; } }