package com.mfh.comn.code.impl; import java.util.HashMap; import java.util.List; import java.util.Map; import com.mfh.comn.code.ICodeHouse; import com.mfh.comn.code.ICodeItem; import com.mfh.comn.code.ICodeService; import com.mfh.comn.code.ISimpleCodeHouse; /** * 编码服务类实现 * * @author zhangyz created on 2013-6-7 * @since Framework 1.0 */ public class CodeService implements ICodeService { private Map<String, ICodeHouse<?>> codeMap = new HashMap<String, ICodeHouse<?>>(); private static CodeService service = null; /** * 增加一个直接编码服务工厂 * @param codeDomain 编码域 * @param codeMaps key-value对,key是编码,value是编码描述 * @author zhangyz created on 2014-4-30 */ public static <T> void addCodeHouse(String codeDomain, Map<T, String> codeMaps) { DirectCodeHouse<T> dc = new DirectCodeHouse<T>(); for (T key : codeMaps.keySet()) { dc.addOption(key, codeMaps.get(key)); } getCodeService().addCodeHouse(dc,codeDomain); } /** * 增加并返回一个直接编码服务工厂,调用者后续可以直接添加 * @param codeDomain 编码域 * @return DirectCodeHouse * @author zhangyz created on 2014-4-30 */ public static <T> DirectCodeHouse<T> addCodeHouse(String codeDomain) { DirectCodeHouse<T> dc = new DirectCodeHouse<T>(); getCodeService().addCodeHouse(dc, codeDomain); return dc; } /** * 增加一个直接编码服务工厂 * @param codeDomain 编码域 * @param dc 简单编码工厂 * @author zhangyz created on 2014-4-30 */ public static <T> void addCodeHouse(String codeDomain, ICodeHouse<T> dc) { getCodeService().addCodeHouse(dc, codeDomain); } /** * 获取编码服务,单例模式 * @return * @author zhangyz created on 2014-3-17 */ public static CodeService getCodeService() { if (service == null) { synchronized(CodeService.class) { if (service == null) service = new CodeService(); } } return service; } @Override public void addCodeHouse(ICodeHouse<?> codeHouse, String... domain) { codeMap.put(genFactDomain(domain), codeHouse); } @Override public <T extends ICodeHouse<?>> T initCodeHouse(Class<T> houseClassName, String... domain) { T house; try { house = (T)houseClassName.newInstance(); codeMap.put(genFactDomain(domain), house); } catch (Exception e) { throw new RuntimeException("实例化编码提供者失败:" + e.getMessage(), e); } return house; } /** * 直接用DirectCodeHouse类实现一个编码提供者,一般供原型快速开发用。 * @param domain * @return */ public <T> DirectCodeHouse<T> initDirectCodeHouse(String... domain) { DirectCodeHouse<T> house = new DirectCodeHouse<T>(); codeMap.put(genFactDomain(domain), house); return house; } @Override public <T> String getValue(String domain, T code) { @SuppressWarnings("unchecked") ICodeHouse<T> codeHouse = (ICodeHouse<T>)codeMap.get(domain); if (codeHouse == null) return null; else return codeHouse.getValue(code); } @Override public <T> String getValue(Class<?> domain, T code) { return getValue(domain.getName(), code); } @Override public <T> String getValue(T code) { return getValue(DOMAIN_DEFAULT, code); } @SuppressWarnings("unchecked") @Override public <T> ISimpleCodeHouse<T> getSimleCodeHouse(String... domain) { return (ISimpleCodeHouse<T>)codeMap.get(genFactDomain(domain)); } /** * 获取一个简单编码提供者 * @param domain * @return * @author zhangyz created on 2014-6-25 */ @SuppressWarnings("unchecked") public static <T> ICodeHouse<T> getCodeHouse(String... domain) { CodeService cs = getCodeService(); return (ICodeHouse<T>)cs.codeMap.get(cs.genFactDomain(domain)); //return getCodeService().getSimleCodeHouse(domain); } /** * 获取一个简单编码提供者 * @param classObj * @return * @author zhangyz created on 2014-6-25 */ public static <T> ICodeHouse<T> getCodeHouse(Class<? extends ICodeHouse<?>> classObj) { return getCodeHouse(classObj.getName()); } /*@SuppressWarnings("unchecked") @Override public <T> ITreeCodeHouse<T> getTreeCodeHouse(String... domain) { return (ITreeCodeHouse<T>)codeMap.get(genFactDomain(domain)); }*/ @Override public <T> List<ICodeItem<T>> getOptions(String domain) { return getOptions(null, domain); } @SuppressWarnings("unchecked") @Override public <T> List<ICodeItem<T>> getOptions(T parentCode, String domain) { ICodeHouse<T> codeHouse = (ICodeHouse<T>) codeMap.get(genFactDomain(domain)); if (codeHouse == null) return null; else { if (parentCode != null) return ((ISimpleCodeHouse<T>)codeHouse).getOptions(parentCode); else return ((ISimpleCodeHouse<T>)codeHouse).getOptions(); } } /*@Override public <T> List<ITreeCodeItem<T>> getTreeOptions(String... domain) { return getTreeOptions(null, domain); } @SuppressWarnings("unchecked") @Override public <T> List<ITreeCodeItem<T>> getTreeOptions(T parentCode, String... domain) { ICodeHouse<T> codeHouse = (ICodeHouse<T>) codeMap.get(genFactDomain(domain)); if (codeHouse == null) return null; else { if (parentCode != null) return ((ITreeCodeHouse<T>)codeHouse).getOptions(parentCode); else return ((ITreeCodeHouse<T>)codeHouse).getOptions(); } }*/ @Override public String getBooleanValue(boolean code) { if (code) return String.valueOf("是"); else return String.valueOf("否"); } @Override public String getIntBooleanValue(int code) { if (code > 0) return String.valueOf("是"); else return String.valueOf("否"); } private String genFactDomain(String... domain) { String factDomain = null; if (domain != null && domain.length > 0) factDomain = domain[0]; else factDomain = DOMAIN_DEFAULT; return factDomain; } }