2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.data.impl.codec.xml;
10 import com.google.common.base.Optional;
11 import com.google.common.base.Preconditions;
14 import java.util.Map.Entry;
15 import javax.xml.parsers.DocumentBuilder;
16 import javax.xml.parsers.DocumentBuilderFactory;
17 import javax.xml.parsers.ParserConfigurationException;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.data.api.AttributesContainer;
20 import org.opendaylight.yangtools.yang.data.api.ModifyAction;
21 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
22 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
23 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28 import org.w3c.dom.Attr;
29 import org.w3c.dom.Document;
30 import org.w3c.dom.Element;
32 public final class XmlDocumentUtils {
34 private XmlDocumentUtils() {
35 throw new UnsupportedOperationException("Utility class should not be instantiated");
38 public static final QName OPERATION_ATTRIBUTE_QNAME = QName.create(SchemaContext.NAME, "operation");
39 private static final Logger LOG = LoggerFactory.getLogger(XmlDocumentUtils.class);
41 public static Document getDocument() {
42 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
45 DocumentBuilder bob = dbf.newDocumentBuilder();
46 doc = bob.newDocument();
47 } catch (ParserConfigurationException e) {
48 throw new RuntimeException(e);
53 private static final Element createElementFor(final Document doc, final QName qname, final Object obj) {
55 if (qname.getNamespace() != null) {
56 ret = doc.createElementNS(qname.getNamespace().toString(), qname.getLocalName());
58 ret = doc.createElementNS(null, qname.getLocalName());
61 if (obj instanceof AttributesContainer) {
62 final Map<QName, String> attrs = ((AttributesContainer)obj).getAttributes();
65 for (Entry<QName, String> attribute : attrs.entrySet()) {
66 ret.setAttributeNS(attribute.getKey().getNamespace().toString(), attribute.getKey().getLocalName(),
67 attribute.getValue());
75 public static Element createElementFor(final Document doc, final NormalizedNode<?, ?> data) {
76 return createElementFor(doc, data.getNodeType(), data);
79 public static QName qNameFromElement(final Element xmlElement) {
80 String namespace = xmlElement.getNamespaceURI();
81 String localName = xmlElement.getLocalName();
82 return QName.create(namespace != null ? URI.create(namespace) : null, null, localName);
87 public static Optional<ModifyAction> getModifyOperationFromAttributes(final Element xmlElement) {
88 Attr attributeNodeNS = xmlElement.getAttributeNodeNS(OPERATION_ATTRIBUTE_QNAME.getNamespace().toString(), OPERATION_ATTRIBUTE_QNAME.getLocalName());
89 if(attributeNodeNS == null) {
90 return Optional.absent();
93 ModifyAction action = ModifyAction.fromXmlValue(attributeNodeNS.getValue());
94 Preconditions.checkArgument(action.isOnElementPermitted(), "Unexpected operation %s on %s", action, xmlElement);
96 return Optional.of(action);
100 public static final Optional<DataSchemaNode> findFirstSchema(final QName qname, final Iterable<DataSchemaNode> dataSchemaNode) {
101 if (dataSchemaNode != null && qname != null) {
102 for (DataSchemaNode dsn : dataSchemaNode) {
103 if (qname.isEqualWithoutRevision(dsn.getQName())) {
104 return Optional.<DataSchemaNode> of(dsn);
105 } else if (dsn instanceof ChoiceSchemaNode) {
106 for (ChoiceCaseNode choiceCase : ((ChoiceSchemaNode) dsn).getCases()) {
107 Optional<DataSchemaNode> foundDsn = findFirstSchema(qname, choiceCase.getChildNodes());
108 if (foundDsn != null && foundDsn.isPresent()) {
115 return Optional.absent();
118 public static final XmlCodecProvider defaultValueCodecProvider() {
119 return XmlUtils.DEFAULT_XML_CODEC_PROVIDER;