BUG 2412 - restconf @POST invokeRpc for notification subscription
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / restconf / impl / ControllerContext.java
index 8bdf401300e91d4e3a67c7e0e58970e432a1283b..a0b05150a84344a8c0cff9ca08472ac3067f2498 100644 (file)
@@ -31,6 +31,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.ws.rs.core.Response.Status;
+import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationException;
 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationOperation;
 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer;
 import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint;
@@ -587,6 +588,15 @@ public class ControllerContext implements SchemaContextListener {
             }
 
             targetNode = findInstanceDataChildByNameAndNamespace(parentNode, nodeName, module.getNamespace());
+
+            if (targetNode == null && parentNode instanceof Module) {
+                final RpcDefinition rpc = ControllerContext.getInstance().getRpcDefinition(head);
+                if (rpc != null) {
+                    return new InstanceIdentifierContext<RpcDefinition>(builder.build(), rpc, mountPoint,
+                            mountPoint != null ? mountPoint.getSchemaContext() : globalSchema);
+                }
+            }
+
             if (targetNode == null) {
                 throw new RestconfDocumentedException("URI has bad format. Possible reasons:\n" + " 1. \"" + head
                         + "\" was not found in parent data node.\n" + " 2. \"" + head
@@ -946,6 +956,26 @@ public class ControllerContext implements SchemaContextListener {
         }
     }
 
+    public YangInstanceIdentifier toXpathRepresentation(final YangInstanceIdentifier instanceIdentifier) {
+        try {
+            return dataNormalizer.toLegacy(instanceIdentifier);
+        } catch (NullPointerException e) {
+            throw new RestconfDocumentedException("Data normalizer isn't set. Normalization isn't possible", e);
+        } catch (DataNormalizationException e) {
+            throw new RestconfDocumentedException("Data normalizer failed. Normalization isn't possible", e);
+        }
+    }
+
+    public boolean isNodeMixin(YangInstanceIdentifier path) {
+        final DataNormalizationOperation<?> operation;
+        try {
+            operation = dataNormalizer.getOperation(path);
+        } catch (DataNormalizationException e) {
+            throw new RestconfDocumentedException("Data normalizer failed. Normalization isn't possible", e);
+        }
+        return operation.isMixin();
+    }
+
     public DataNormalizationOperation<?> getRootOperation() {
         return dataNormalizer.getRootOperation();
     }