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<String, IVariantGuide> listenerMap;
|
private static Set<String> QAlistenerSet;
|
private static TreeSet<VariantProviderInfo> namedListenerInfoSet;
|
private static TreeSet<VariantProviderInfo> QAListenerInfoSet;
|
|
|
private VariantCenter() {
|
listenerMap = new HashMap<String, IVariantGuide>();
|
QAlistenerSet = new HashSet<String>();
|
|
namedListenerInfoSet = new TreeSet<VariantProviderInfo>();
|
QAListenerInfoSet = new TreeSet<VariantProviderInfo>();
|
}
|
|
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<String> 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<String> 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<String, IVariantGuide> getListenerMap() {
|
return listenerMap;
|
}
|
|
public static Set<String> 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();
|
}
|
|
}
|