import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.AttributesContainer;
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
-import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.ModifyAction;
import org.opendaylight.yangtools.yang.data.api.Node;
-import org.opendaylight.yangtools.yang.data.api.SimpleNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Attr;
return createElementFor(doc, data.getNodeType(), data);
}
- public static void writeValueByType(final Element element, final SimpleNode<?> node, final TypeDefinition<?> type,
- final DataSchemaNode schema, final XmlCodecProvider codecProvider) {
-
- Object nodeValue = node.getValue();
-
- writeValueByType(element, type, codecProvider, nodeValue);
- }
-
- public static void writeValueByType(final Element element, final TypeDefinition<?> type, final XmlCodecProvider codecProvider, final Object nodeValue) {
- TypeDefinition<?> baseType = resolveBaseTypeFrom(type);
- if (baseType instanceof IdentityrefTypeDefinition) {
- if (nodeValue instanceof QName) {
- QName value = (QName) nodeValue;
- String prefix = "x";
- if (value.getPrefix() != null && !value.getPrefix().isEmpty()) {
- prefix = value.getPrefix();
- }
- element.setAttribute("xmlns:" + prefix, value.getNamespace().toString());
- element.setTextContent(prefix + ":" + value.getLocalName());
- } else {
- Object value = nodeValue;
- logger.debug("Value of {}:{} is not instance of QName but is {}", baseType.getQName().getNamespace(),
- baseType.getQName().getLocalName(), value != null ? value.getClass() : "null");
- if (value != null) {
- element.setTextContent(String.valueOf(value));
- }
- }
- } else if (baseType instanceof InstanceIdentifierTypeDefinition) {
- if (nodeValue instanceof InstanceIdentifier) {
- InstanceIdentifierForXmlCodec.serialize((InstanceIdentifier)nodeValue,element);
- } else {
- Object value = nodeValue;
- logger.debug("Value of {}:{} is not instance of InstanceIdentifier but is {}", baseType.getQName()
- .getNamespace(), //
- baseType.getQName().getLocalName(), value != null ? value.getClass() : "null");
- if (value != null) {
- element.setTextContent(String.valueOf(value));
- }
- }
- } else {
- if (nodeValue != null) {
- final TypeDefinitionAwareCodec<Object, ?> codec = codecProvider.codecFor(baseType);
- if (codec != null) {
- try {
- final String text = codec.serialize(nodeValue);
- element.setTextContent(text);
- } catch (ClassCastException e) {
- logger.error("Provided node value {} did not have type {} required by mapping. Using stream instead.", nodeValue, baseType, e);
- element.setTextContent(String.valueOf(nodeValue));
- }
- } else {
- logger.error("Failed to find codec for {}, falling back to using stream", baseType);
- element.setTextContent(String.valueOf(nodeValue));
- }
- }
- }
- }
-
- public final static TypeDefinition<?> resolveBaseTypeFrom(final TypeDefinition<?> type) {
- TypeDefinition<?> superType = type;
- while (superType.getBaseType() != null) {
- superType = superType.getBaseType();
- }
- return superType;
- }
-
public static Node<?> toDomNode(final Element xmlElement, final Optional<DataSchemaNode> schema,
final Optional<XmlCodecProvider> codecProvider) {
if (schema.isPresent()) {
*/
package org.opendaylight.yangtools.yang.data.impl.schema.transform.dom;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.Lists;
+
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.XMLConstants;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.dom.DOMResult;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider;
import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils;
+import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlStreamUtils;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.Lists;
-
-public class DomUtils {
-
- private DomUtils() {
- }
+public final class DomUtils {
private static final XmlCodecProvider DEFAULT_XML_VALUE_CODEC_PROVIDER = new XmlCodecProvider() {
-
@Override
- public TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codecFor(TypeDefinition<?> baseType) {
+ public TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codecFor(final TypeDefinition<?> baseType) {
return TypeDefinitionAwareCodec.from(baseType);
}
};
+ private DomUtils() {
+ }
+
public static XmlCodecProvider defaultValueCodecProvider() {
return DEFAULT_XML_VALUE_CODEC_PROVIDER;
}
- public static Object parseXmlValue(Element xml, XmlCodecProvider codecProvider, TypeDefinition<?> type) {
+ public static Object parseXmlValue(final Element xml, final XmlCodecProvider codecProvider, final TypeDefinition<?> type) {
TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codec = codecProvider.codecFor(type);
String text = xml.getTextContent();
return value;
}
- public static void serializeXmlValue(Element itemEl, TypeDefinition<? extends TypeDefinition<?>> type, XmlCodecProvider codecProvider, Object value) {
- XmlDocumentUtils.writeValueByType(itemEl, type, codecProvider, value);
+ public static void serializeXmlValue(final Element element, final TypeDefinition<? extends TypeDefinition<?>> type, final XmlCodecProvider codecProvider, final Object value) {
+ try {
+ XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new DOMResult(element));
+ XmlStreamUtils.create(codecProvider).writeValue(writer, type, value);
+ } catch (XMLStreamException e) {
+ throw new IllegalStateException("XML encoding failed", e);
+ }
}
- public static LinkedListMultimap<QName, Element> mapChildElementsForSingletonNode(Element node) {
+ public static LinkedListMultimap<QName, Element> mapChildElementsForSingletonNode(final Element node) {
List<Element> childNodesCollection = Lists.newArrayList();
NodeList childNodes = node.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
return mapChildElements(childNodesCollection);
}
- public static LinkedListMultimap<QName, Element> mapChildElements(Iterable<Element> childNodesCollection) {
+ public static LinkedListMultimap<QName, Element> mapChildElements(final Iterable<Element> childNodesCollection) {
LinkedListMultimap<QName, Element> mappedChildElements = LinkedListMultimap.create();
for (Element element : childNodesCollection) {
}
- public static Map<QName, String> toAttributes(NamedNodeMap xmlAttributes) {
+ public static Map<QName, String> toAttributes(final NamedNodeMap xmlAttributes) {
Map<QName, String> attributes = new HashMap<>();
for (int i = 0; i < xmlAttributes.getLength(); i++) {