import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
import org.opendaylight.restconf.nb.rfc8040.rests.services.api.RestconfInvokeOperationsService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.CreateDataChangeEventSubscriptionInput;
import org.opendaylight.yangtools.yang.common.ErrorTag;
import org.opendaylight.yangtools.yang.common.ErrorType;
import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-import org.opendaylight.yangtools.yang.common.XMLNamespace;
import org.opendaylight.yangtools.yang.common.YangConstants;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
public class RestconfInvokeOperationsServiceImpl implements RestconfInvokeOperationsService {
private static final Logger LOG = LoggerFactory.getLogger(RestconfInvokeOperationsServiceImpl.class);
- // FIXME: at some point we do not want to have this here
- private static final XMLNamespace SAL_REMOTE_NAMESPACE =
- XMLNamespace.of("urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote");
+ // FIXME: at some point we do not want to have this here, as this is only used for dispatch
+ private static final QNameModule SAL_REMOTE_NAMESPACE = CreateDataChangeEventSubscriptionInput.QNAME.getModule();
private final DOMRpcService rpcService;
private final SchemaContextHandler schemaContextHandler;
final ListenableFuture<? extends DOMRpcResult> future;
if (mountPoint == null) {
- // FIXME: this really should be a normal RPC invocation service which has its own interface with JAX-RS
- if (SAL_REMOTE_NAMESPACE.equals(rpcName.getNamespace())) {
+ // FIXME: this really should be a normal RPC invocation service which has its own interface with JAX-RS,
+ // except ... we check 'identifier' for .contains() instead of exact RPC name!
+ if (SAL_REMOTE_NAMESPACE.equals(rpcName.getModule())) {
if (identifier.contains("create-data-change-event-subscription")) {
future = Futures.immediateFuture(
CreateStreamUtil.createDataChangeNotifiStream(payload, schemaContext));
* @return element of {@link Document}
*/
protected Element basePartDoc(final Document doc) {
- final Element notificationElement =
- doc.createElementNS("urn:ietf:params:xml:ns:netconf:notification:1.0", "notification");
+ final Element notificationElement = doc.createElementNS(
+ NotificationFormatter.NOTIFICATION_NAMESPACE, NotificationFormatter.NOTIFICATION_ELEMENT);
doc.appendChild(notificationElement);
*/
package org.opendaylight.restconf.nb.rfc8040.streams.listeners;
+import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.DATA_CHANGED_NOTIFICATION_ELEMENT;
+import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.DATA_CHANGE_EVENT_ELEMENT;
+import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.NOTIFICATION_ELEMENT;
+import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.NOTIFICATION_NAMESPACE;
+import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.SAL_REMOTE_NAMESPACE;
import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.XML_OUTPUT_FACTORY;
-import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.XMLNotificationFormatter.DATA_CHANGE_EVENT_ELEMENT;
import java.io.IOException;
import java.time.Instant;
@Override
final void fillDocument(final Document doc, final EffectiveModelContext schemaContext,
final Collection<DataTreeCandidate> input) throws IOException {
- final Element notificationElement = doc.createElementNS("urn:ietf:params:xml:ns:netconf:notification:1.0",
- "notification");
+ final Element notificationElement = doc.createElementNS(NOTIFICATION_NAMESPACE, NOTIFICATION_ELEMENT);
final Element eventTimeElement = doc.createElement("eventTime");
eventTimeElement.setTextContent(toRFC3339(Instant.now()));
notificationElement.appendChild(eventTimeElement);
final Element notificationEventElement = doc.createElementNS(
- "urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote", "data-changed-notification");
+ SAL_REMOTE_NAMESPACE, DATA_CHANGED_NOTIFICATION_ELEMENT);
for (DataTreeCandidate candidate : input) {
final Element dataChangedElement = doc.createElement(DATA_CHANGE_EVENT_ELEMENT);
import javax.xml.xpath.XPathExpressionException;
import org.opendaylight.mdsal.dom.api.DOMEvent;
import org.opendaylight.mdsal.dom.api.DOMNotification;
+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.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
import org.w3c.dom.Element;
abstract class NotificationFormatter extends EventFormatter<DOMNotification> {
+ static final String NOTIFICATION_NAMESPACE = "urn:ietf:params:xml:ns:netconf:notification:1.0";
+ static final String NOTIFICATION_ELEMENT = "notification";
+
+ static final String SAL_REMOTE_NAMESPACE = DataChangedNotification.QNAME.getNamespace().toString();
+ static final String DATA_CHANGED_NOTIFICATION_ELEMENT = DataChangedNotification.QNAME.getLocalName();
+ static final String DATA_CHANGE_EVENT_ELEMENT = DataChangeEvent.QNAME.getLocalName();
+
static final XMLOutputFactory XML_OUTPUT_FACTORY;
static {
@Override
final void fillDocument(final Document doc, final EffectiveModelContext schemaContext, final DOMNotification input)
throws IOException {
- final Element notificationElement = doc.createElementNS("urn:ietf:params:xml:ns:netconf:notification:1.0",
- "notification");
+ final Element notificationElement = doc.createElementNS(NOTIFICATION_NAMESPACE, NOTIFICATION_ELEMENT);
final Element eventTimeElement = doc.createElement("eventTime");
- if (input instanceof DOMEvent) {
- eventTimeElement.setTextContent(toRFC3339(((DOMEvent) input).getEventInstant()));
- } else {
- eventTimeElement.setTextContent(toRFC3339(Instant.now()));
- }
+ final Instant now = input instanceof DOMEvent domEvent ? domEvent.getEventInstant() : Instant.now();
+ eventTimeElement.setTextContent(toRFC3339(now));
notificationElement.appendChild(eventTimeElement);
- final Element notificationEventElement = doc.createElementNS(
- "urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote", "create-notification-stream");
+ final Element notificationEventElement = doc.createElementNS(SAL_REMOTE_NAMESPACE,
+ "create-notification-stream");
final Element dataElement = doc.createElement("notification");
final DOMResult result = new DOMResult(dataElement);
try {
*/
package org.opendaylight.restconf.nb.rfc8040.streams.listeners;
+import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.DATA_CHANGED_NOTIFICATION_ELEMENT;
+import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.NOTIFICATION_ELEMENT;
+import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.NOTIFICATION_NAMESPACE;
+import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.SAL_REMOTE_NAMESPACE;
import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationFormatter.XML_OUTPUT_FACTORY;
-import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.XMLNotificationFormatter.DATA_CHANGED_NAMESPACE;
-import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.XMLNotificationFormatter.DATA_CHANGED_NOTIFICATION_ELEMENT;
-import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.XMLNotificationFormatter.NOTIFICATION_ELEMENT;
-import static org.opendaylight.restconf.nb.rfc8040.streams.listeners.XMLNotificationFormatter.NOTIFICATION_NAMESPACE;
import java.io.IOException;
import java.io.StringWriter;
xmlStreamWriter.writeCharacters(toRFC3339(now));
xmlStreamWriter.writeEndElement();
- xmlStreamWriter.setDefaultNamespace(DATA_CHANGED_NAMESPACE);
- xmlStreamWriter.writeStartElement(DATA_CHANGED_NAMESPACE, DATA_CHANGED_NOTIFICATION_ELEMENT);
+ xmlStreamWriter.setDefaultNamespace(SAL_REMOTE_NAMESPACE);
+ xmlStreamWriter.writeStartElement(SAL_REMOTE_NAMESPACE, DATA_CHANGED_NOTIFICATION_ELEMENT);
final XmlDataTreeCandidateSerializer serializer =
new XmlDataTreeCandidateSerializer(schemaContext, xmlStreamWriter);
final class XMLNotificationFormatter extends NotificationFormatter {
private static final XMLNotificationFormatter INSTANCE = new XMLNotificationFormatter();
- static final String NOTIFICATION_NAMESPACE = "urn:ietf:params:xml:ns:netconf:notification:1.0";
- static final String NOTIFICATION_ELEMENT = "notification";
-
- static final String DATA_CHANGED_NAMESPACE = "urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote";
- static final String DATA_CHANGED_NOTIFICATION_ELEMENT = "data-changed-notification";
-
- static final String DATA_CHANGE_EVENT_ELEMENT = "data-change-event";
-
static final NotificationFormatterFactory FACTORY = new NotificationFormatterFactory() {
@Override
public XMLNotificationFormatter getFormatter(final String xpathFilter) throws XPathExpressionException {