Bug 6935 - RPC in latest draft doesn't work - problem of parsing
[netconf.git] / restconf / sal-rest-connector / src / main / java / org / opendaylight / restconf / utils / parser / ParserIdentifier.java
index fc2703f98be3a9eb3a2a4496e2554f0a9e05919d..0ed61c60b602b8b130264f8bfc8bffca63e778d6 100644 (file)
@@ -7,10 +7,6 @@
  */
 package org.opendaylight.restconf.utils.parser;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
 import java.text.ParseException;
 import java.util.Date;
 import java.util.Iterator;
@@ -30,10 +26,15 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
 import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import com.google.common.base.Optional;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 
 /**
  * Util class for parsing identifier
@@ -70,7 +71,7 @@ public final class ParserIdentifier {
             final String identifier,
             final SchemaContext schemaContext,
             final Optional<DOMMountPointService> mountPointService) {
-        if (identifier != null && identifier.contains(RestconfConstants.MOUNT)) {
+        if ((identifier != null) && identifier.contains(RestconfConstants.MOUNT)) {
             if (!mountPointService.isPresent()) {
                 throw new RestconfDocumentedException("Mount point service is not available");
             }
@@ -93,16 +94,37 @@ public final class ParserIdentifier {
 
             final DataSchemaContextNode<?> child = DataSchemaContextTree.from(
                     mountPoint.get().getSchemaContext()).getChild(pathYangInstanceIdentifier);
-
-            return new InstanceIdentifierContext<SchemaNode>(
-                    pathYangInstanceIdentifier, child.getDataSchemaNode(), mountPoint.get(),
+            if (child != null) {
+                return new InstanceIdentifierContext<SchemaNode>(pathYangInstanceIdentifier, child.getDataSchemaNode(),
+                        mountPoint.get(), mountPoint.get().getSchemaContext());
+            }
+            final QName rpcQName = mountYangInstanceIdentifier.getLastPathArgument().getNodeType();
+            RpcDefinition def = null;
+            for (final RpcDefinition rpcDefinition : schemaContext
+                    .findModuleByNamespaceAndRevision(rpcQName.getNamespace(), rpcQName.getRevision()).getRpcs()) {
+                if (rpcDefinition.getQName().getLocalName().equals(rpcQName.getLocalName())) {
+                    def = rpcDefinition;
+                    break;
+                }
+            }
+            return new InstanceIdentifierContext<RpcDefinition>(mountYangInstanceIdentifier, def, mountPoint.get(),
                     mountPoint.get().getSchemaContext());
         } else {
             final YangInstanceIdentifier deserialize = IdentifierCodec.deserialize(identifier, schemaContext);
             final DataSchemaContextNode<?> child = DataSchemaContextTree.from(schemaContext).getChild(deserialize);
 
-            return new InstanceIdentifierContext<SchemaNode>(
-                    deserialize, child.getDataSchemaNode(), null, schemaContext);
+            if(child != null){
+                return new InstanceIdentifierContext<SchemaNode>(deserialize, child.getDataSchemaNode(), null, schemaContext);
+            }
+            final QName rpcQName = deserialize.getLastPathArgument().getNodeType();
+            RpcDefinition def = null;
+            for (final RpcDefinition rpcDefinition : schemaContext.findModuleByNamespaceAndRevision(rpcQName.getNamespace(), rpcQName.getRevision()).getRpcs()) {
+                if (rpcDefinition.getQName().getLocalName().equals(rpcQName.getLocalName())) {
+                    def = rpcDefinition;
+                    break;
+                }
+            }
+            return new InstanceIdentifierContext<RpcDefinition>(deserialize, def, null, schemaContext);
         }
     }