package pl.net.bluesoft.rnd.processtool.model.dict;
import org.apache.commons.collections.CollectionUtils;
import pl.net.bluesoft.rnd.processtool.model.config.ProcessDefinitionConfig;
import pl.net.bluesoft.rnd.pt.utils.lang.Lang2;
import java.util.*;
/**
* User: POlszewski
* Date: 2012-09-12
* Time: 22:31
*/
public class MultiLevelDictionary implements ProcessDictionary<String, String> {
private ProcessDictionary<String, String>[] dictionaries;
private Collection<String> allItemKeys;
private Collection<ProcessDictionaryItem<String, String>> allItems;
public MultiLevelDictionary(ProcessDictionary... dictionaries) {
this.dictionaries = Lang2.noCopy(dictionaries);
}
public MultiLevelDictionary(List<ProcessDictionary> dictionaries) {
this(Lang2.toObjectArray(dictionaries, ProcessDictionary.class));
}
@Override
public String getDictionaryId() {
return dictionaries[0].getDictionaryId();
}
@Override
public String getDictionaryName() {
return dictionaries[0].getDictionaryName();
}
@Override
public String getLanguageCode() {
return dictionaries[0].getLanguageCode();
}
@Override
public Boolean isDefaultDictionary() {
return false;
}
@Override
public ProcessDefinitionConfig getProcessDefinition() {
return dictionaries[0].getProcessDefinition();
}
@Override
public ProcessDictionaryItem<String, String> lookup(String key) {
for (ProcessDictionary<String, String> dictionary : dictionaries) {
if (dictionary.containsKey(key)) {
return dictionary.lookup(key);
}
}
return null;
}
@Override
public Collection<String> itemKeys() {
if (allItemKeys == null) {
allItemKeys = new ArrayList<String>();
for (ProcessDictionary<String, String> dictionary : dictionaries) {
allItemKeys.addAll(dictionary.itemKeys());
}
}
return allItemKeys;
}
@Override
public Collection<ProcessDictionaryItem<String, String>> items() {
if (allItems == null) {
allItems = new ArrayList<ProcessDictionaryItem<String, String>>();
Set<String> addedKeys = new HashSet<String>();
for (ProcessDictionary<String, String> dictionary : dictionaries) {
for (String key : dictionary.itemKeys()) {
if (!addedKeys.contains(key)) {
allItems.add(dictionary.lookup(key));
addedKeys.add(key);
}
}
}
}
return allItems;
}
@Override
public boolean containsKey(String key) {
return itemKeys().contains(key);
}
}