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.omd.constants.OmdConstants;
import com.vci.client.common.providers.ServiceProvider;
import com.vci.corba.common.VCIError;
import com.vci.corba.omd.etm.EnumChild;
import com.vci.corba.omd.etm.EnumItem;
import com.vci.corba.omd.etm.EnumServicePrx;
public class EnumProvider {
private EnumProvider(){
}
private static class InstanceHolder{
private static EnumProvider instance = new EnumProvider();
}
public static EnumProvider getInstance(){
return InstanceHolder.instance;
}
public EnumServicePrx getService(){
try {
return ServiceProvider.getOMDService().getEnumService();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取所有枚举
* @return
*/
public EnumItem[] getAllEnums(){
try {
return getService().getEmItems("", 1, 1);
} catch (VCIError e) {
e.printStackTrace();
}
return null;
}
/**
* 获取指定的枚举
* @param name
* @return
*/
public EnumItem getEnumByName(String name){
try {
return getService().getEmItemByName(name);
} catch (VCIError e) {
e.printStackTrace();
}
return null;
}
/**
* 根据枚举名和 枚举项名获取枚举项值
* @param enumName
* @param enumChildName
* @return
*/
public String getEnumItemValue(String enumName, String enumChildName) {
EnumItem enumItem = getInstance().getEnumByName(enumName);
for(EnumChild ec : enumItem.children){
if(ec.name.equalsIgnoreCase(enumChildName)){
return ec.value;
}
}
return null;
}
public boolean expData(String dir, EnumItem[] objs) {
//TODO调用ENUM的导出
BufferedWriter bw = null;
FileOutputStream fos = null;
OutputStreamWriter osw =null;
try{
File file = new File(dir + "/enum.txt");
//将clob字段写到单独的文件中
new File(dir + "/enum").mkdir();
//add by caill start 2015.12.16 导出时将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(EnumItem o : objs){
//若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 + "/enum/" + o.oid + ".xml");
//add by caill start 2015.12.15 将xml内容和xml文件格式统一
fo = new FileOutputStream(clobFile);
pw = new OutputStreamWriter(fo, "utf-8");
clobBW = new BufferedWriter(pw);
clobBW.write( "");
clobBW.write(getXmlText(o));
clobBW.flush();
//pw.close();
//add by caill end
/*File clobFile = new File(dir + "/enum/" + o.oid + ".xml");
clobW = new FileWriter(clobFile);
clobBW = new BufferedWriter(clobW);
clobBW.write( "");//gb2312
clobBW.write(getXmlText(o));
clobBW.flush();*/
}catch(IOException e2){
e2.printStackTrace();
}finally{
try{
if(clobBW != null){
//clobW.close();
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();
}
}
}
bw.flush();
System.out.println("**************枚举导出成功************");
return true;
}catch(IOException e){
e.printStackTrace();
System.out.println("**************枚举导出失败************");
return false;
}finally{
try {
if(bw != null){
//w.close();
fos.close(); //add by caill 2015.12.16 将fos关闭
osw.close(); //add by caill 2015.12.16 将osw关闭
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 将对象转化成字符串
* {oid:qqq, name:q}
* @param o
* @return
*/
public String getObjectText(EnumItem 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.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();
}
/**
* 将emItem转化成xmltext
* @param emItem
* @return
*/
public String getXmlText(EnumItem emItem) {
StringBuilder stb = new StringBuilder("");
stb.append("" + emItem.name + "");
stb.append("");
stb.append("" + emItem.type + "");
stb.append("" + emItem.length + "");
for(EnumChild ec : emItem.children){
stb.append("");
stb.append("" + ec.name + "");
stb.append("" + ec.value + "");
stb.append("" + ec.description + "");
stb.append("");
}
stb.append("");
return stb.toString();
}
/**
* 从导入文件中解析出EnumItem
* @param dir
* @return
*/
public List getEnumsFromFile(String dir){
File file = new File(dir + "/enum.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.16 导入时将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 + "/enum/" + oid + ".xml");
if(!contentFile.exists()){
System.out.println(dir + "/enum/" + oid + ".xml不存在");
break;
}
EnumItem em = new EnumItem();
em.oid = oid;
em.name = map.get("name");
em.label = map.get("label");
//em.label = map.get("ts");
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"));
SAXReader sa = new SAXReader();
//add by caill 2015.12.16 导入时将saxReader对象设置为“utf-8”格式
sa.setEncoding("utf-8");
Document document = sa.read(contentFile);
setEnumValueFormDoc(em, document.getRootElement());
list.add(em);
}else{
System.out.println(dir + "enum.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 {
//r.close();
fo.close(); //add by caill 2015.12.16 将fo关闭
isw.close(); //add by caill 2015.12.16 将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 em
* @param element
*/
public void setEnumValueFormDoc(EnumItem em, Element element){
String value = element.elementText("type");
em.type = (value == null ? "" : value);
value = element.elementText("length");
em.length = (value == null ? 0 : Integer.valueOf(value));
List children = element.elements("child");
List ecList = new ArrayList();
for(Element child : children){
EnumChild ec = new EnumChild();
value = child.elementText("name");
ec.name = (value == null ? "" : value);
value = child.elementText("value");
ec.value = (value == null ? "" : value);
value = child.elementText("description");
ec.description = (value == null ? "" : value);
ecList.add(ec);
}
em.children = ecList.toArray(new EnumChild[0]);
}
/**
* 导入数据
* @param array
* @return
*/
public boolean impData(EnumItem[] ems) {
try {
for(EnumItem em : ems){
EnumItem em_ = getService().getEmItemByName(em.name);
//已经存在
if(!em_.oid.equals("")){
//类型一致则覆盖
if(em.type.equals(em_.type)){
getService().deleteEmItem(em_);
getService().addEmItem(em);
System.out.println(em.name + "在数据库中已经存在,且类型与文件中的一致。 覆盖。");
//类型不一致则中止导入
}else{
System.out.println(em.name + "在数据库中已经存在,且类型与文件中的不一致。 中止导入。");
return false;
}
}else{
getService().addEmItem(em);
}
}
return true;
} catch (VCIError e) {
e.printStackTrace();
}
return false;
}
}