package no.met.metadataeditor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import no.met.metadataeditor.dataTypes.DataAttributeValidationResult;
import no.met.metadataeditor.dataTypes.attributes.DataAttribute;
import no.met.metadataeditor.widget.EditorWidget;
/**
* Class used to represent one set of values for EditorWidget.
*
* EditorWidgets can have several different values. Each set of value is represented by one
* instance of this class.
*
* The widget views are exposed to the JSF .xhtml files and used to fetch the values displayed
* to the user.
*/
public class EditorWidgetView implements Serializable {
private static final long serialVersionUID = 4577883892935459131L;
private Map<String, String> values = new HashMap<>();
private List<EditorWidget> children = new ArrayList<>();
private Map<String, EditorWidget> childMap = new HashMap<>();
private Class<? extends DataAttribute> dataAttributeClass;
public EditorWidgetView(){
}
public void addValue(String varName, String value) {
values.put(varName, value);
}
public Map<String, String> getValues() {
return values;
}
public void setValues(Map<String, String> values) {
this.values = values;
}
public List<EditorWidget> getChildren() {
return children;
}
public void setChildren(List<EditorWidget> children) {
this.children = children;
childMap.clear();
for( EditorWidget child : this.children ){
childMap.put(child.getVariableName(), child);
}
}
public boolean hasChildWidget(String varName){
return childMap.containsKey(varName);
}
public EditorWidget getChildWidget(String varName){
return childMap.get(varName);
}
public void setDataAttributeClass(Class<? extends DataAttribute> dataAttributeClass) {
this.dataAttributeClass = dataAttributeClass;
}
public DataAttribute valuesAsAttriubte(){
DataAttribute da = getAttributeInstance();
for (Map.Entry<String, String> entry : values.entrySet()) {
String value = entry.getValue();
if( value != null ){
value = value.replace("\r", "");
}
da.addAttribute(entry.getKey(), value);
}
return da;
}
private Map<String, DataAttributeValidationResult> validate(){
DataAttribute da = valuesAsAttriubte();
return da.validateAttributes();
}
public String validateAttribute(String attributeName){
Map<String, DataAttributeValidationResult> result = validate();
return result.get(attributeName).errorMsg;
}
private DataAttribute getAttributeInstance(){
try {
DataAttribute da = this.dataAttributeClass.newInstance();
return da;
} catch (InstantiationException e) {
String msg = "Failed to instantiate a new DataAttribute instance in EditorWidgetView.";
Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, msg, e);
throw new EditorException(msg, e, EditorException.GENERAL_ERROR_CODE);
} catch (IllegalAccessException e) {
String msg = "Could not access constructed when creating a new DataAttribute instance in EditorWidgetView.";
Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, msg, e);
throw new EditorException(msg, e, EditorException.GENERAL_ERROR_CODE);
}
}
}