package foundation.variant.provider; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeSet; import foundation.json.IJSONProvider; import foundation.json.IJSONWriter; public class VariantCenter implements IJSONProvider { private static Object lock = new Object(); private static VariantCenter instance; private static Map listenerMap; private static Set QAlistenerSet; private static TreeSet namedListenerInfoSet; private static TreeSet QAListenerInfoSet; private VariantCenter() { listenerMap = new HashMap(); QAlistenerSet = new HashSet(); namedListenerInfoSet = new TreeSet(); QAListenerInfoSet = new TreeSet(); } public static VariantCenter getInstance() { if (instance == null) { synchronized(lock) { try { if (instance == null) { instance = new VariantCenter(); } } catch(Exception e) { e.printStackTrace(); } } } return instance; } public static Object getValue(DataEvent dataEvent, String variantName, IVariantsProvider... providers) { if (variantName == null) { return null; } Object result = null; variantName = variantName.toLowerCase(); IVariantGuide guide = listenerMap.get(variantName); //1. if (guide != null) { result = guide.getValue(dataEvent, variantName, providers); return result; } //2. if (providers == null || providers.length == 0) { return result; } for (IVariantsProvider provider: providers) { if (provider == null) { continue; } String providerName = provider.getProviderName(); providerName = providerName.toLowerCase(); if (QAlistenerSet.contains(providerName)) { if (provider.containsVariant(variantName)) { result = provider.getVariantValue(dataEvent, variantName); break; } } } return result; } public static String getStringValue(DataEvent dataEvent, String variantName, IVariantsProvider... providers) { Object value = getValue(dataEvent, variantName, providers); if (value == null) { return null; } if (value instanceof String) { return (String)value; } return String.valueOf(value); } public void registPersist(Set variantNames, IVariantsProvider provider) { if (variantNames == null) { return; } for (String name: variantNames) { if (name == null) { continue; } String lower = name.toLowerCase(); PersistGuide guide = new PersistGuide(provider); listenerMap.put(lower, guide); namedListenerInfoSet.add(new VariantProviderInfo("PersistProvider", name, guide.getVariantProvider().getClass())); } } public void registTransiant(Set variantNames, String providerName, Class clazz) { if (variantNames == null) { return; } for (String name: variantNames) { if (name == null) { continue; } String lower = name.toLowerCase(); TransiantGuide guide = new TransiantGuide(providerName); listenerMap.put(lower, guide); namedListenerInfoSet.add(new VariantProviderInfo("TransiantProvider", name, clazz)); } } public void registQAProvider(String providerName, Class clazz) { if (providerName == null) { return; } String lower = providerName.toLowerCase(); QAlistenerSet.add(lower); QAListenerInfoSet.add(new VariantProviderInfo("Q&A", "", clazz)); } public static Map getListenerMap() { return listenerMap; } public static Set getQAlistenerSet() { return QAlistenerSet; } @Override public void writeJSON(IJSONWriter writer) { writer.beginObject(); //1. named listener writer.beginArray("namedListeners"); for (VariantProviderInfo providerInfo: namedListenerInfoSet) { writer.beginObject(); writer.write("type", providerInfo.getTypeCode()); writer.write("variant", providerInfo.getVariantName()); writer.write("provider", providerInfo.getClassName()); writer.endObject(); } writer.endArray(); //2. QA listener writer.beginArray("qaListeners"); for (VariantProviderInfo providerInfo: QAListenerInfoSet) { writer.beginObject(); writer.write("type", providerInfo.getTypeCode()); writer.write("variant", providerInfo.getVariantName()); writer.write("provider", providerInfo.getClassName()); writer.endObject(); } writer.endArray(); writer.endObject(); } }