package com.firefly.core.support.xml.parse;
import java.util.List;
import org.w3c.dom.Element;
import com.firefly.core.support.xml.ManagedMap;
import com.firefly.core.support.xml.ManagedValue;
import com.firefly.core.support.xml.XmlManagedNode;
import com.firefly.utils.dom.Dom;
public class MapNodeParser extends AbstractXmlNodeParser implements
XmlNodeParser {
@Override
public Object parse(Element ele, Dom dom) {
String typeName = ele.getAttribute(XmlNodeConstants.TYPE_ATTRIBUTE);
ManagedMap<XmlManagedNode, XmlManagedNode> target = new ManagedMap<XmlManagedNode, XmlManagedNode>();
target.setTypeName(typeName);
List<Element> elements = dom.elements(ele);
for (Element entry : elements) {
XmlManagedNode key = null;
XmlManagedNode value = null;
if (entry.hasAttribute(XmlNodeConstants.KEY_ATTRIBUTE)) {
key = new ManagedValue(entry.getAttribute(XmlNodeConstants.KEY_ATTRIBUTE));
}
if (entry.hasAttribute(XmlNodeConstants.VALUE_ATTRIBUTE)) {
value = new ManagedValue(entry.getAttribute(XmlNodeConstants.VALUE_ATTRIBUTE));
}
List<Element> keyEle = dom.elements(entry,XmlNodeConstants.MAP_KEY_ELEMENT);
if (keyEle.size() > 1) {
error("must not contain more than one key-element");
} else if (keyEle.size() == 1) {
if (key != null) {
error("only allowed to contain either 'key' attribute OR key-element");
} else {
List<Element> subKey = dom.elements(keyEle.get(0));
if (subKey.size() != 1) {
String keyText = dom.getTextValue(keyEle.get(0));
if (keyText == null)
error("must contain one key-sub-element");
else
key = new ManagedValue(keyText);
} else {
key = (XmlManagedNode)XmlNodeStateMachine.stateProcessor(subKey.get(0), dom);
}
}
} else {
if (key == null)
error("not contain 'key' attribute OR key-element");
}
List<Element> valueEle = dom.elements(entry, XmlNodeConstants.MAP_VALUE_ELEMENT);
if (valueEle.size() > 1) {
error("must not contain more than one value-element");
} else if (valueEle.size() == 1) {
if (value != null) {
error("only allowed to contain either 'value' attribute OR value-element");
} else {
List<Element> subValue = dom.elements(valueEle.get(0));
if (subValue.size() != 1) {
String valueText = dom.getTextValue(valueEle.get(0));
if (valueText == null)
error("must contain one value-sub-element");
else
value = new ManagedValue(valueText);
} else {
value = (XmlManagedNode)XmlNodeStateMachine.stateProcessor(subValue.get(0), dom);
}
}
} else {
if (value == null)
error("not contain 'value' attribute OR value-element");
}
target.put(key, value);
}
return target;
}
}