2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.restconf.common.formatters;
10 import static org.opendaylight.restconf.common.formatters.NotificationFormatter.XML_OUTPUT_FACTORY;
11 import static org.opendaylight.restconf.common.formatters.XMLNotificationFormatter.NOTIFICATION_ELEMENT;
12 import static org.opendaylight.restconf.common.formatters.XMLNotificationFormatter.NOTIFICATION_NAMESPACE;
14 import java.io.IOException;
15 import java.io.StringWriter;
16 import java.time.Instant;
17 import java.util.Collection;
18 import javax.xml.stream.XMLStreamException;
19 import javax.xml.stream.XMLStreamWriter;
20 import javax.xml.xpath.XPathExpressionException;
21 import org.opendaylight.restconf.common.serializer.XmlDataTreeCandidateSerializer;
22 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
23 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
25 public final class XMLDataTreeCandidateFormatter extends DataTreeCandidateFormatter {
26 private static final XMLDataTreeCandidateFormatter INSTANCE = new XMLDataTreeCandidateFormatter();
28 public static final DataTreeCandidateFormatterFactory FACTORY =
29 new DataTreeCandidateFormatterFactory() {
31 public XMLDataTreeCandidateFormatter getFormatter(final String xpathFilter)
32 throws XPathExpressionException {
33 return new XMLDataTreeCandidateFormatter(xpathFilter);
37 public XMLDataTreeCandidateFormatter getFormatter() {
42 private XMLDataTreeCandidateFormatter() {
45 private XMLDataTreeCandidateFormatter(final String xpathFilter) throws XPathExpressionException {
50 String createText(EffectiveModelContext schemaContext, Collection<DataTreeCandidate> input, Instant now,
51 boolean leafNodesOnly, boolean skipData)
53 StringWriter writer = new StringWriter();
55 final XMLStreamWriter xmlStreamWriter;
57 xmlStreamWriter = XML_OUTPUT_FACTORY.createXMLStreamWriter(writer);
58 xmlStreamWriter.setDefaultNamespace(NOTIFICATION_NAMESPACE);
60 xmlStreamWriter.writeStartElement(NOTIFICATION_NAMESPACE, NOTIFICATION_ELEMENT);
61 xmlStreamWriter.writeDefaultNamespace(NOTIFICATION_NAMESPACE);
63 xmlStreamWriter.writeStartElement("eventTime");
64 xmlStreamWriter.writeCharacters(toRFC3339(now));
65 xmlStreamWriter.writeEndElement();
67 xmlStreamWriter.writeStartElement("data-changed-notification");
69 final XmlDataTreeCandidateSerializer serializer =
70 new XmlDataTreeCandidateSerializer(schemaContext, xmlStreamWriter);
72 for (final DataTreeCandidate candidate : input) {
73 serializer.serialize(candidate, leafNodesOnly, skipData);
76 // data-changed-notification
77 xmlStreamWriter.writeEndElement();
80 xmlStreamWriter.writeEndElement();
81 } catch (XMLStreamException e) {
82 throw new IOException("Failed to write notification content", e);
86 return writer.toString();