Make ListenerAdapter serialize JSON directly
[netconf.git] / restconf / restconf-common / src / main / java / org / opendaylight / restconf / common / formatters / XMLDataTreeCandidateFormatter.java
1 /*
2  * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.restconf.common.formatters;
9
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;
13
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;
24
25 public final class XMLDataTreeCandidateFormatter extends DataTreeCandidateFormatter {
26     private static final XMLDataTreeCandidateFormatter INSTANCE = new XMLDataTreeCandidateFormatter();
27
28     public static final DataTreeCandidateFormatterFactory FACTORY =
29         new DataTreeCandidateFormatterFactory() {
30             @Override
31             public XMLDataTreeCandidateFormatter getFormatter(final String xpathFilter)
32                     throws XPathExpressionException {
33                 return new XMLDataTreeCandidateFormatter(xpathFilter);
34             }
35
36             @Override
37             public XMLDataTreeCandidateFormatter getFormatter() {
38                 return INSTANCE;
39             }
40         };
41
42     private XMLDataTreeCandidateFormatter() {
43     }
44
45     private XMLDataTreeCandidateFormatter(final String xpathFilter) throws XPathExpressionException {
46         super(xpathFilter);
47     }
48
49     @Override
50     String createText(EffectiveModelContext schemaContext, Collection<DataTreeCandidate> input, Instant now,
51                       boolean leafNodesOnly, boolean skipData)
52             throws Exception {
53         StringWriter writer = new StringWriter();
54
55         final XMLStreamWriter xmlStreamWriter;
56         try {
57             xmlStreamWriter = XML_OUTPUT_FACTORY.createXMLStreamWriter(writer);
58             xmlStreamWriter.setDefaultNamespace(NOTIFICATION_NAMESPACE);
59
60             xmlStreamWriter.writeStartElement(NOTIFICATION_NAMESPACE, NOTIFICATION_ELEMENT);
61             xmlStreamWriter.writeDefaultNamespace(NOTIFICATION_NAMESPACE);
62
63             xmlStreamWriter.writeStartElement("eventTime");
64             xmlStreamWriter.writeCharacters(toRFC3339(now));
65             xmlStreamWriter.writeEndElement();
66
67             xmlStreamWriter.writeStartElement("data-changed-notification");
68
69             final XmlDataTreeCandidateSerializer serializer =
70                     new XmlDataTreeCandidateSerializer(schemaContext, xmlStreamWriter);
71
72             for (final DataTreeCandidate candidate : input) {
73                 serializer.serialize(candidate, leafNodesOnly, skipData);
74             }
75
76             // data-changed-notification
77             xmlStreamWriter.writeEndElement();
78
79             // notification
80             xmlStreamWriter.writeEndElement();
81         } catch (XMLStreamException e) {
82             throw new IOException("Failed to write notification content", e);
83         }
84
85
86         return writer.toString();
87     }
88 }