/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package jhydra.core.valuemap;
import jhydra.core.lexicon.ILexicon;
import jhydra.core.lexicon.exceptions.NameNotInLexiconException;
import jhydra.core.properties.INameValue;
import jhydra.core.properties.INameValueValidator;
import jhydra.core.properties.NameValueValidator;
import jhydra.core.properties.exceptions.NameNotValidException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author jantic
*/
public class ValueMap implements IValueMap {
private final ILexicon lexicon;
private final INameValueValidator nameValueValidator = new NameValueValidator();
private final Map<String,INameValue> map = new HashMap<>();
public ValueMap(ILexicon lexicon){
this.lexicon = lexicon;
initializeFromLexicon();
}
@Override
public String getValue(String name) throws NameNotInLexiconException, NameNotValidException{
validateName(name);
final String key = generateKey(name);
return map.get(key).getValue();
}
@Override
public boolean hasValue(String name){
final String key = generateKey(name);
return map.containsKey(key);
}
@Override
public void setValue(String name, String value) throws NameNotInLexiconException, NameNotValidException{
validateName(name);
final String key = generateKey(name);
final INameValue oldPair = map.get(key);
final INameValue newPair = oldPair.copyWithNewValue(value);
map.put(key, newPair);
}
@Override
public void updateValues(List<INameValue> pairs) throws NameNotInLexiconException, NameNotValidException {
for(INameValue pair : pairs){
this.setValue(pair.getName(), pair.getValue());
}
}
private void initializeFromLexicon(){
final List<INameValue> initPairs = lexicon.getAllNameDefaultValuePairs();
for(INameValue pair : initPairs){
addPairFromLexicon(pair);
}
}
private void addPairFromLexicon(INameValue pair){
final String name = pair.getName();
final String key = generateKey(name);
map.put(key, pair);
}
private void validateName(String name) throws NameNotInLexiconException, NameNotValidException{
nameValueValidator.validateName(name);
final String key = generateKey(name);
if(!map.containsKey(key)){
final String message = "Value named '" + name + "' could not be found!";
throw new NameNotInLexiconException(message, this.lexicon.getFilePaths());
}
}
private String generateKey(String name){
if(name == null){
return "";
}
return name.toLowerCase().trim();
}
}