package com.ycsoft.commons.store;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import com.ycsoft.beans.system.SDataTranslation;
import com.ycsoft.beans.system.SItemvalue;
import com.ycsoft.business.commons.pojo.Parameter;
import com.ycsoft.commons.constants.DictKey;
import com.ycsoft.commons.helper.LoggerHelper;
import com.ycsoft.commons.helper.StringHelper;
import static com.ycsoft.commons.constants.SystemConstants.LANGUAGE_ZH;
import static com.ycsoft.commons.constants.SystemConstants.LANGUAGE_EN;
import static com.ycsoft.commons.constants.SystemConstants.LANGUAGE_KH;
/**
* @author <a href="mailto:nbljq99@163.com">Liujiaqi</a>
*
*/
public class MemoryDict {
private static ThreadLocal<String> langThreadLocal = new ThreadLocal<String>();
// 字典
private static Map<String, Map<String, SItemvalue>> dictMap = new HashMap<String,Map<String,SItemvalue>>();
private static List<SItemvalue> datalist = new ArrayList<SItemvalue>();
private static Map<String, SDataTranslation> transMap = new HashMap<String, SDataTranslation>();
private static List<SDataTranslation> transList = new ArrayList<SDataTranslation>();
private static boolean loadingData = false;
public static void setLang(String lang){
langThreadLocal.set(lang);
}
public static String getLang(){
return langThreadLocal.get();
}
/**
* 获取字典表name项
*
* @param keyname
* @param value
* @return
*/
public static String getDictName(Object keyname, String value) {
if(keyname == null || StringHelper.isEmpty(value)) return "";
Map<String, SItemvalue> m = getDictMap().get(keyname.toString());
if (m == null)
return "";
SItemvalue s = m.get(value);
if (s == null)
return "";
return getTransData(s.getItem_name());
}
private static String getLanguageData(SDataTranslation dataTrans){
if(LANGUAGE_EN.equals( getLang() ) && StringHelper.isNotEmpty(dataTrans.getData_en())){
return dataTrans.getData_en();
}else if(LANGUAGE_KH.equals( getLang() ) && StringHelper.isNotEmpty(dataTrans.getData_kh())){
return dataTrans.getData_kh();
}
return dataTrans.getData_cn();
}
public static String getTransData(String dataCn) {
if(StringHelper.isEmpty(dataCn)) return "";
SDataTranslation dataTrans = getTransMap().get(dataCn);
if(dataTrans == null) return dataCn;
return getLanguageData(dataTrans);
}
private static SItemvalue createItemvalue(SItemvalue s){
SItemvalue itemvalue = new SItemvalue();
itemvalue.setItem_desc(s.getItem_desc());
itemvalue.setItem_idx(s.getItem_idx());
itemvalue.setItem_key(s.getItem_key());
itemvalue.setItem_name(s.getItem_name());
itemvalue.setItem_value(s.getItem_value());
itemvalue.setShow_county_id(s.getShow_county_id());
return itemvalue;
}
@Override
public void finalize() {
langThreadLocal.remove();
}
/**
* 获取字典表name项
*
* @param keyname
* @param value
* @return
*/
public static SItemvalue getDictItem(Object keyname, String value) {
if(StringHelper.isEmpty(value)) return null;
Map<String, SItemvalue> m = getDictMap().get(keyname.toString());
if (m == null)
return null;
SItemvalue s = m.get(value);
if (s == null)
return null;
SItemvalue itemvalue = createItemvalue(s);
itemvalue.setItem_name( getTransData(s.getItem_name()) );
return s;
}
/**
* 获取指定key字典集合
*
* @param keyname
* @return
*/
public static List<SItemvalue> getDicts(Object keyname) {
Map<String, SItemvalue> m = getDictMap().get(keyname.toString());
if (m != null){
List<SItemvalue> list = new ArrayList<SItemvalue>();
for(String key : m.keySet()){
SItemvalue s = m.get(key);
SItemvalue itemvalue = createItemvalue(s);
itemvalue.setItem_name( getTransData(s.getItem_name()) );
list.add(itemvalue);
}
Collections.sort(list, new Comparator<SItemvalue>() {
public int compare(final SItemvalue c1, final SItemvalue c2) {
if (c1.getItem_idx() != null && c2.getItem_idx() != null){
if (c1.getItem_idx() > c2.getItem_idx()) {
return 1;
} else {
if (c1.getItem_idx().compareTo( c2.getItem_idx()) ==0) {
return 0;
} else {
return -1;
}
}
}
return 0;
}
});
return list;
}
return new ArrayList<SItemvalue>();
}
private static void loadData() {
if (loadingData)
synchronized (MemoryDict.class) {
if (loadingData) {
Map<String, Map<String, SItemvalue>> tempmap = new HashMap<String, Map<String, SItemvalue>>();
Map<String, SDataTranslation> transTempMap = new HashMap<String, SDataTranslation>();
try {
for (SItemvalue itemvalue : datalist) {
String key = itemvalue.getItem_key();
Map<String, SItemvalue> dicts = tempmap.get(key);
if (dicts == null) {
dicts = new Hashtable<String, SItemvalue>();
tempmap.put(key, dicts);
}
dicts.put(itemvalue.getItem_value(), itemvalue);
}
dictMap = tempmap;
for (SDataTranslation trans : transList) {
String key = trans.getData_cn();
SDataTranslation dataTrans = transTempMap.get(key);
if (dataTrans == null) {
dataTrans = new SDataTranslation();
transTempMap.put(key, dataTrans);
}
BeanUtils.copyProperties(dataTrans, trans);
}
transMap = transTempMap;
} catch (Exception e) {
LoggerHelper.error(MemoryDict.class, "字典装载异常");
} finally{
loadingData = false;
}
}
}
}
private static void reLoadData() {
loadingData = true;
loadData();
}
/**
* 在原数据中添加数据,并从新装载
*
* @param adddatalist
* 新添加的数据
*/
public static void setupData(List<SItemvalue> datalist, List<SDataTranslation> transList) {
MemoryDict.datalist = datalist;
MemoryDict.transList = transList;
reLoadData();
}
public static void setTransData(List<SDataTranslation> transList){
MemoryDict.transList = transList;
reLoadData();
}
/**
* 添加字典数据
* 重复关键字的数据,删除原有数据,以新添加的为准
* [会删除]传入数据键值相关的所有数据
*
* @param datalist
*/
public static void appendData(List<SItemvalue> datalist) {
try {
Map<String, Map<String, SItemvalue>> tempmap = new HashMap<String, Map<String, SItemvalue>>();
for (SItemvalue itemvalue : datalist) {
String key = itemvalue.getItem_key();
Map<String, SItemvalue> dicts = tempmap.get(key);
if (dicts == null) {
dicts = new Hashtable<String, SItemvalue>();
tempmap.put(key, dicts);
}
dicts.put(itemvalue.getItem_value(), itemvalue);
}
dictMap.putAll(tempmap);
} catch (Exception e) {
LoggerHelper.error(MemoryDict.class, "字典装载异常");
} finally{
if (dictMap == null){
dictMap = new HashMap<String, Map<String, SItemvalue>>();
}
}
}
public static void appendTransData(List<SDataTranslation> datalist) {
try {
for (SDataTranslation trans : datalist) {
getTransMap().put(trans.getData_cn(), trans);
}
} catch (Exception e) {
LoggerHelper.error(MemoryDict.class, "国际化数据装载异常");
} finally{
if (transMap == null){
transMap = new HashMap<String, SDataTranslation>();
}
}
}
/**
* 添加字典数据
* 有相同的覆盖,没有就新添加
* [不会删除]传入数据键值相关的所有数据
* @param datalist
*/
public static void addData(List<SItemvalue> datalist) {
try {
for (SItemvalue itemvalue : datalist) {
String key = itemvalue.getItem_key();
Map<String, SItemvalue> dicts = dictMap.get(key);
if (dicts == null) {
dicts = new Hashtable<String, SItemvalue>();
dictMap.put(key, dicts);
}
dicts.put(itemvalue.getItem_value(), itemvalue);
}
} catch (Exception e) {
LoggerHelper.error(MemoryDict.class, "字典装载异常");
} finally{
if (dictMap == null){
dictMap = new HashMap<String, Map<String, SItemvalue>>();
}
}
}
public static Map<String, Map<String, SItemvalue>> getDictMap() {
loadData();
return dictMap;
}
public static Map<String, SDataTranslation> getTransMap() {
loadData();
return transMap;
}
}