package org.opendaylight.restconf.nb.rfc8040.streams;
import java.io.IOException;
+import java.time.Instant;
import java.util.List;
import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.dom.DOMResult;
import javax.xml.xpath.XPathExpressionException;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.DataChangedNotification;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.data.changed.notification.DataChangeEvent;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
import org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.w3c.dom.Document;
-import org.w3c.dom.Element;
/**
* Base formatter for DataTreeCandidates which only handles exporting to a document for filter checking purpose.
@Override
final void fillDocument(final Document doc, final EffectiveModelContext schemaContext,
final List<DataTreeCandidate> input) throws IOException {
- final Element notificationElement = NotificationFormatter.createNotificationElement(doc);
- final Element notificationEventElement = doc.createElementNS(
- DATA_CHANGED_NOTIFICATION_NS, DATA_CHANGED_NOTIFICATION_ELEMENT);
+ final var notificationElement = createNotificationElement(doc, Instant.now());
+ final var notificationEventElement = doc.createElementNS(DATA_CHANGED_NOTIFICATION_NS,
+ DATA_CHANGED_NOTIFICATION_ELEMENT);
- for (DataTreeCandidate candidate : input) {
- final Element dataChangedElement = doc.createElement(DATA_CHANGE_EVENT_ELEMENT);
+ for (var candidate : input) {
+ final var dataChangedElement = doc.createElement(DATA_CHANGE_EVENT_ELEMENT);
try {
- final Element dataElement = doc.createElement("data");
- final DOMResult domResult = new DOMResult(dataElement);
- final XMLStreamWriter writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(domResult);
-
- writeCandidate(XMLStreamNormalizedNodeStreamWriter.create(writer, schemaContext,
- candidate.getRootPath()), candidate);
-
+ final var dataElement = doc.createElement("data");
+ final var dataAfter = candidate.getRootNode().dataAfter();
+ if (dataAfter != null) {
+ try (var writer = XMLStreamNormalizedNodeStreamWriter.create(
+ XML_OUTPUT_FACTORY.createXMLStreamWriter(new DOMResult(dataElement)), schemaContext,
+ candidate.getRootPath())) {
+ writeBody(writer, dataAfter);
+ }
+ }
dataChangedElement.appendChild(dataElement);
- } catch (final XMLStreamException e) {
+ } catch (XMLStreamException e) {
throw new IOException("Failed to write notification content", e);
}
notificationElement.appendChild(notificationEventElement);
}
doc.appendChild(notificationElement);
}
-
- static void writeCandidate(final NormalizedNodeStreamWriter writer, final DataTreeCandidate candidate)
- throws IOException {
- final var dataAfter = candidate.getRootNode().dataAfter();
- if (dataAfter != null) {
- try (var nodeWriter = NormalizedNodeWriter.forStreamWriter(writer)) {
- nodeWriter.write(dataAfter);
- }
- }
- }
}
import static java.util.Objects.requireNonNull;
import java.io.IOException;
+import java.io.Writer;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.netconf.api.NamespaceURN;
import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.w3c.dom.Document;
+import org.w3c.dom.Element;
abstract class EventFormatter<T> implements Immutable {
private static final XPathFactory XPF = XPathFactory.newInstance();
* @param now time stamp
* @return Data specified by RFC3339.
*/
- static String toRFC3339(final Instant now) {
+ static final String toRFC3339(final Instant now) {
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(OffsetDateTime.ofInstant(now, ZoneId.systemDefault()));
}
+
+ static final @NonNull Element createNotificationElement(final Document doc, final Instant now) {
+ final var notificationElement = doc.createElementNS(NamespaceURN.NOTIFICATION, "notification");
+ final var eventTimeElement = doc.createElement("eventTime");
+ eventTimeElement.setTextContent(toRFC3339(now));
+ notificationElement.appendChild(eventTimeElement);
+ return notificationElement;
+ }
+
+ static final @NonNull XMLStreamWriter createStreamWriterWithNotification(final Writer writer, final Instant now)
+ throws XMLStreamException {
+ final var xmlStreamWriter = XML_OUTPUT_FACTORY.createXMLStreamWriter(writer);
+ xmlStreamWriter.setDefaultNamespace(NamespaceURN.NOTIFICATION);
+
+ xmlStreamWriter.writeStartElement(NamespaceURN.NOTIFICATION, "notification");
+ xmlStreamWriter.writeDefaultNamespace(NamespaceURN.NOTIFICATION);
+
+ xmlStreamWriter.writeStartElement("eventTime");
+ xmlStreamWriter.writeCharacters(toRFC3339(now));
+ xmlStreamWriter.writeEndElement();
+ return xmlStreamWriter;
+ }
+
+ static final void writeBody(final NormalizedNodeStreamWriter writer, final NormalizedNode body) throws IOException {
+ try (var nodeWriter = NormalizedNodeWriter.forStreamWriter(writer)) {
+ nodeWriter.write(body);
+ }
+ }
}
jsonWriter.beginObject()
.name(NOTIFICATION_NAME).beginObject()
.name("event-time").value(toRFC3339(now));
- writeNotificationBody(JSONNormalizedNodeStreamWriter.createNestedWriter(
+ writeBody(JSONNormalizedNodeStreamWriter.createNestedWriter(
JSONCodecFactorySupplier.RFC7951.getShared(schemaContext), input.getType(), null, jsonWriter),
input.getBody());
jsonWriter.endObject().endObject();
package org.opendaylight.restconf.nb.rfc8040.streams;
import java.io.IOException;
-import java.io.Writer;
import java.time.Instant;
import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.dom.DOMResult;
import javax.xml.xpath.XPathExpressionException;
-import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.dom.api.DOMEvent;
import org.opendaylight.mdsal.dom.api.DOMNotification;
-import org.opendaylight.netconf.api.NamespaceURN;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.CreateNotificationStream;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
import org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.w3c.dom.Document;
-import org.w3c.dom.Element;
abstract class NotificationFormatter extends EventFormatter<DOMNotification> {
- private static final String NOTIFICATION_ELEMENT = "notification";
private static final String CREATE_NOTIFICATION_STREAM_ELEMENT = CreateNotificationStream.QNAME.getLocalName();
private static final String CREATE_NOTIFICATION_STREAM_NS =
CreateNotificationStream.QNAME.getNamespace().toString();
throws IOException {
final var notificationElement = createNotificationElement(doc,
input instanceof DOMEvent domEvent ? domEvent.getEventInstant() : Instant.now());
+ // FIXME: what is this really?!
final var notificationEventElement = doc.createElementNS(CREATE_NOTIFICATION_STREAM_NS,
CREATE_NOTIFICATION_STREAM_ELEMENT);
- final var dataElement = doc.createElement(NOTIFICATION_ELEMENT);
- final DOMResult result = new DOMResult(dataElement);
+ final var dataElement = doc.createElement("notification");
try {
- final XMLStreamWriter writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(result);
+ final var writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(new DOMResult(dataElement));
try {
- writeNotificationBody(XMLStreamNormalizedNodeStreamWriter.create(writer, schemaContext,
- input.getType()), input.getBody());
+ writeBody(XMLStreamNormalizedNodeStreamWriter.create(writer, schemaContext, input.getType()),
+ input.getBody());
} finally {
writer.close();
}
notificationElement.appendChild(notificationEventElement);
doc.appendChild(notificationElement);
}
-
- static void writeNotificationBody(final NormalizedNodeStreamWriter writer, final ContainerNode body)
- throws IOException {
- try (NormalizedNodeWriter nodeWriter = NormalizedNodeWriter.forStreamWriter(writer)) {
- nodeWriter.write(body);
- }
- }
-
- /**
- * Generating base element of every notification.
- *
- * @param doc base {@link Document}
- * @return element of {@link Document}
- */
- static @NonNull Element createNotificationElement(final Document doc) {
- return createNotificationElement(doc, Instant.now());
- }
-
- static @NonNull Element createNotificationElement(final Document doc, final Instant now) {
- final var notificationElement = doc.createElementNS(NamespaceURN.NOTIFICATION, NOTIFICATION_ELEMENT);
- final Element eventTimeElement = doc.createElement("eventTime");
- eventTimeElement.setTextContent(toRFC3339(now));
- notificationElement.appendChild(eventTimeElement);
- return notificationElement;
- }
-
- static @NonNull XMLStreamWriter createStreamWriterWithNotification(final Writer writer, final Instant now)
- throws XMLStreamException {
- final var xmlStreamWriter = XML_OUTPUT_FACTORY.createXMLStreamWriter(writer);
- xmlStreamWriter.setDefaultNamespace(NamespaceURN.NOTIFICATION);
-
- xmlStreamWriter.writeStartElement(NamespaceURN.NOTIFICATION, NOTIFICATION_ELEMENT);
- xmlStreamWriter.writeDefaultNamespace(NamespaceURN.NOTIFICATION);
-
- xmlStreamWriter.writeStartElement("eventTime");
- xmlStreamWriter.writeCharacters(toRFC3339(now));
- xmlStreamWriter.writeEndElement();
- return xmlStreamWriter;
- }
}
try {
final var xmlStreamWriter = NotificationFormatter.createStreamWriterWithNotification(writer, now);
- final var nnStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter, schemaContext,
- input.getType());
-
- try (var nnWriter = NormalizedNodeWriter.forStreamWriter(nnStreamWriter)) {
+ try (var nnWriter = NormalizedNodeWriter.forStreamWriter(XMLStreamNormalizedNodeStreamWriter.create(
+ xmlStreamWriter, schemaContext, input.getType()))) {
nnWriter.write(input.getBody());
nnWriter.flush();