Revert "Revert "Replace #getPath in processInstanceIdentifierType""
[netconf.git] / restconf / sal-rest-docgen / src / main / java / org / opendaylight / netconf / sal / rest / doc / impl / DefinitionGenerator.java
index 6b7b73e36c3bec44646aba681ad043e6d7b9840b..56c2638edeada5a227ab80486dea29c6e3c1baea 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint;
 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
@@ -54,9 +55,7 @@ import org.opendaylight.yangtools.yang.model.api.MandatoryAware;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
 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.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
@@ -83,7 +82,7 @@ import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.Uint64TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.Uint8TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
-import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -139,7 +138,7 @@ public class DefinitionGenerator {
      */
 
 
-    public ObjectNode convertToJsonSchema(final Module module, final SchemaContext schemaContext,
+    public ObjectNode convertToJsonSchema(final Module module, final EffectiveModelContext schemaContext,
                                           final ObjectNode definitions, final DefinitionNames definitionNames,
                                           final OAversion oaversion, final boolean isForSingleModule)
             throws IOException {
@@ -156,7 +155,7 @@ public class DefinitionGenerator {
         return definitions;
     }
 
-    public ObjectNode convertToJsonSchema(final Module module, final SchemaContext schemaContext,
+    public ObjectNode convertToJsonSchema(final Module module, final EffectiveModelContext schemaContext,
                                           final DefinitionNames definitionNames, final OAversion oaversion,
                                           final boolean isForSingleModule)
             throws IOException {
@@ -168,13 +167,15 @@ public class DefinitionGenerator {
     }
 
     private void processModule(final Module module, final ObjectNode definitions, final DefinitionNames definitionNames,
-                               final SchemaContext schemaContext, final OAversion oaversion) {
+                               final EffectiveModelContext schemaContext, final OAversion oaversion) {
         final ObjectNode definition = JsonNodeFactory.instance.objectNode();
         final ObjectNode properties = JsonNodeFactory.instance.objectNode();
         final ArrayNode required = JsonNodeFactory.instance.arrayNode();
         final String moduleName = module.getName();
         final String definitionName = moduleName + MODULE_NAME_SUFFIX;
+        final SchemaInferenceStack stack = SchemaInferenceStack.of(schemaContext);
         for (final DataSchemaNode node : module.getChildNodes()) {
+            stack.enterSchemaTree(node.getQName());
             final String localName = node.getQName().getLocalName();
             if (node.isConfiguration()) {
                 if (node instanceof ContainerSchemaNode || node instanceof ListSchemaNode) {
@@ -209,11 +210,12 @@ public class DefinitionGenerator {
                             Add module name prefix to property name, when ServiceNow can process colons(second parameter
                             of processLeafNode).
                          */
-                        processLeafNode((LeafSchemaNode) node, localName, properties, required, schemaContext,
+                        processLeafNode((LeafSchemaNode) node, localName, properties, required, stack,
                                 definitions, definitionNames, oaversion);
                     }
                 }
             }
+            stack.exit();
         }
         definition.put(TITLE_KEY, definitionName);
         definition.put(TYPE_KEY, OBJECT_TYPE);
@@ -225,63 +227,68 @@ public class DefinitionGenerator {
     }
 
     private void processContainersAndLists(final Module module, final ObjectNode definitions,
-                                           final DefinitionNames definitionNames, final SchemaContext schemaContext,
-                                           final OAversion oaversion) throws IOException {
+            final DefinitionNames definitionNames, final EffectiveModelContext schemaContext, final OAversion oaversion)
+                throws IOException {
         final String moduleName = module.getName();
-
+        final SchemaInferenceStack stack = SchemaInferenceStack.of(schemaContext);
         for (final DataSchemaNode childNode : module.getChildNodes()) {
+            stack.enterSchemaTree(childNode.getQName());
             // For every container and list in the module
             if (childNode instanceof ContainerSchemaNode || childNode instanceof ListSchemaNode) {
                 if (childNode.isConfiguration()) {
                     processDataNodeContainer((DataNodeContainer) childNode, moduleName, definitions, definitionNames,
-                            true, schemaContext, oaversion);
+                            true, stack, oaversion);
                 }
                 processDataNodeContainer((DataNodeContainer) childNode, moduleName, definitions, definitionNames,
-                        false, schemaContext, oaversion);
-                processActionNodeContainer(childNode, moduleName, definitions, definitionNames, schemaContext,
-                        oaversion);
+                        false, stack, oaversion);
+                processActionNodeContainer(childNode, moduleName, definitions, definitionNames, stack, oaversion);
             }
+            stack.exit();
         }
     }
 
     private void processActionNodeContainer(final DataSchemaNode childNode, final String moduleName,
                                             final ObjectNode definitions, final DefinitionNames definitionNames,
-                                            final SchemaContext schemaContext, final OAversion oaversion)
+                                            final SchemaInferenceStack stack, final OAversion oaversion)
             throws IOException {
         for (final ActionDefinition actionDef : ((ActionNodeContainer) childNode).getActions()) {
-            processOperations(actionDef, moduleName, definitions, definitionNames, schemaContext, oaversion);
+            processOperations(actionDef, moduleName, definitions, definitionNames, stack, oaversion);
         }
     }
 
     private void processRPCs(final Module module, final ObjectNode definitions, final DefinitionNames definitionNames,
-                             final SchemaContext schemaContext, final OAversion oaversion) throws IOException {
+                             final EffectiveModelContext schemaContext, final OAversion oaversion) throws IOException {
         final String moduleName = module.getName();
+        final SchemaInferenceStack stack = SchemaInferenceStack.of(schemaContext);
         for (final RpcDefinition rpcDefinition : module.getRpcs()) {
-            processOperations(rpcDefinition, moduleName, definitions, definitionNames, schemaContext, oaversion);
+            stack.enterSchemaTree(rpcDefinition.getQName());
+            processOperations(rpcDefinition, moduleName, definitions, definitionNames, stack, oaversion);
+            stack.exit();
         }
     }
 
-
     private void processOperations(final OperationDefinition operationDef, final String parentName,
-                                   final ObjectNode definitions, final DefinitionNames definitionNames,
-                                   final SchemaContext schemaContext, final OAversion oaversion) throws IOException {
+            final ObjectNode definitions, final DefinitionNames definitionNames,
+            final SchemaInferenceStack stack, final OAversion oaversion)
+                throws IOException {
         final String operationName = operationDef.getQName().getLocalName();
         processOperationInputOutput(operationDef.getInput(), operationName, parentName, true, definitions,
-                definitionNames, schemaContext, oaversion);
+                definitionNames, stack, oaversion);
         processOperationInputOutput(operationDef.getOutput(), operationName, parentName, false, definitions,
-                definitionNames, schemaContext, oaversion);
+                definitionNames, stack, oaversion);
     }
 
     private void processOperationInputOutput(final ContainerLike container, final String operationName,
                                              final String parentName, final boolean isInput,
                                              final ObjectNode definitions, final DefinitionNames definitionNames,
-                                             final SchemaContext schemaContext, final OAversion oaversion)
+                                             final SchemaInferenceStack stack, final OAversion oaversion)
             throws IOException {
+        stack.enterSchemaTree(container.getQName());
         if (!container.getChildNodes().isEmpty()) {
             final String filename = parentName + "_" + operationName + (isInput ? INPUT_SUFFIX : OUTPUT_SUFFIX);
             final ObjectNode childSchema = JsonNodeFactory.instance.objectNode();
             processChildren(childSchema, container.getChildNodes(), parentName, definitions, definitionNames,
-                    false, schemaContext, oaversion);
+                    false, stack, oaversion);
 
             childSchema.put(TYPE_KEY, OBJECT_TYPE);
             final ObjectNode xml = JsonNodeFactory.instance.objectNode();
@@ -294,10 +301,11 @@ public class DefinitionGenerator {
 
             processTopData(filename, discriminator, definitions, container, oaversion);
         }
+        stack.exit();
     }
 
-    private ObjectNode processTopData(final String filename, final String discriminator, final ObjectNode definitions,
-                                      final SchemaNode schemaNode, final OAversion oaversion) {
+    private static ObjectNode processTopData(final String filename, final String discriminator,
+            final ObjectNode definitions, final SchemaNode schemaNode, final OAversion oaversion) {
         final ObjectNode dataNodeProperties = JsonNodeFactory.instance.objectNode();
         final String name = filename + discriminator;
         final String ref = getAppropriateModelPrefix(oaversion) + name;
@@ -341,8 +349,7 @@ public class DefinitionGenerator {
      * @param definitionNames Store for definition names
      */
     private static void processIdentities(final Module module, final ObjectNode definitions,
-                                          final DefinitionNames definitionNames, final SchemaContext context) {
-
+                                          final DefinitionNames definitionNames, final EffectiveModelContext context) {
         final String moduleName = module.getName();
         final Collection<? extends IdentitySchemaNode> idNodes = module.getIdentities();
         LOG.debug("Processing Identities for module {} . Found {} identity statements", moduleName, idNodes.size());
@@ -357,7 +364,7 @@ public class DefinitionGenerator {
     }
 
     private static void populateEnumWithDerived(final Collection<? extends IdentitySchemaNode> derivedIds,
-                                                final ArrayNode enumPayload, final SchemaContext context) {
+                                                final ArrayNode enumPayload, final EffectiveModelContext context) {
         for (final IdentitySchemaNode derivedId : derivedIds) {
             enumPayload.add(derivedId.getQName().getLocalName());
             populateEnumWithDerived(context.getDerivedIdentities(derivedId), enumPayload, context);
@@ -366,7 +373,7 @@ public class DefinitionGenerator {
 
     private ObjectNode processDataNodeContainer(final DataNodeContainer dataNode, final String parentName,
                                                 final ObjectNode definitions, final DefinitionNames definitionNames,
-                                                final boolean isConfig, final SchemaContext schemaContext,
+                                                final boolean isConfig, final SchemaInferenceStack stack,
                                                 final OAversion oaversion) throws IOException {
         if (dataNode instanceof ListSchemaNode || dataNode instanceof ContainerSchemaNode) {
             final Collection<? extends DataSchemaNode> containerChildren = dataNode.getChildNodes();
@@ -376,7 +383,7 @@ public class DefinitionGenerator {
             final String nameAsParent = parentName + "_" + localName;
             final ObjectNode properties =
                     processChildren(childSchema, containerChildren, parentName + "_" + localName, definitions,
-                            definitionNames, isConfig, schemaContext, oaversion);
+                            definitionNames, isConfig, stack, oaversion);
 
             final String nodeName = parentName + (isConfig ? CONFIG : "") + "_" + localName;
             final String postNodeName = parentName + CONFIG + "_" + localName + POST_SUFFIX;
@@ -422,8 +429,8 @@ public class DefinitionGenerator {
         return null;
     }
 
-    private ObjectNode createPostJsonSchema(final SchemaNode dataNode, final ObjectNode properties,
-                                            final String postNodeName, final String description) {
+    private static ObjectNode createPostJsonSchema(final SchemaNode dataNode, final ObjectNode properties,
+            final String postNodeName, final String description) {
         final ObjectNode postSchema = JsonNodeFactory.instance.objectNode();
         final ObjectNode postItemProperties;
         if (dataNode instanceof ListSchemaNode) {
@@ -439,7 +446,7 @@ public class DefinitionGenerator {
         return postSchema;
     }
 
-    private ObjectNode createListItemProperties(final ObjectNode properties, final ListSchemaNode listNode) {
+    private static ObjectNode createListItemProperties(final ObjectNode properties, final ListSchemaNode listNode) {
         final ObjectNode postListItemProperties = JsonNodeFactory.instance.objectNode();
         final List<QName> keyDefinition = listNode.getKeyDefinition();
         final Set<String> keys = listNode.getChildNodes().stream()
@@ -464,10 +471,11 @@ public class DefinitionGenerator {
     private ObjectNode processChildren(
             final ObjectNode parentNode, final Collection<? extends DataSchemaNode> nodes, final String parentName,
             final ObjectNode definitions, final DefinitionNames definitionNames, final boolean isConfig,
-            final SchemaContext schemaContext, final OAversion oaversion) throws IOException {
+            final SchemaInferenceStack stack, final OAversion oaversion) throws IOException {
         final ObjectNode properties = JsonNodeFactory.instance.objectNode();
         final ArrayNode required = JsonNodeFactory.instance.arrayNode();
         for (final DataSchemaNode node : nodes) {
+            stack.enterSchemaTree(node.getQName());
             if (!isConfig || node.isConfiguration()) {
                 /*
                     Add module name prefix to property name, when needed, when ServiceNow can process colons,
@@ -477,45 +485,48 @@ public class DefinitionGenerator {
                 final ObjectNode property;
                 if (node instanceof LeafSchemaNode) {
                     processLeafNode((LeafSchemaNode) node, propertyName, properties,
-                            required, schemaContext, definitions, definitionNames, oaversion);
+                            required, stack, definitions, definitionNames, oaversion);
                 } else if (node instanceof AnyxmlSchemaNode) {
                     processAnyXMLNode((AnyxmlSchemaNode) node, propertyName, properties,
                             required);
                 } else if (node instanceof AnydataSchemaNode) {
-                    processAnydataNode((AnydataSchemaNode) node, propertyName, properties,
-                            required);
+                    processAnydataNode((AnydataSchemaNode) node, propertyName, properties, required);
                 } else {
                     if (node instanceof ListSchemaNode || node instanceof ContainerSchemaNode) {
                         property = processDataNodeContainer((DataNodeContainer) node, parentName, definitions,
-                                definitionNames, isConfig, schemaContext, oaversion);
+                                definitionNames, isConfig, stack, oaversion);
                         if (!isConfig) {
-                            processActionNodeContainer(node, parentName, definitions, definitionNames, schemaContext,
+                            processActionNodeContainer(node, parentName, definitions, definitionNames, stack,
                                     oaversion);
                         }
                     } else if (node instanceof LeafListSchemaNode) {
-                        property = processLeafListNode((LeafListSchemaNode) node, schemaContext, definitions,
+                        property = processLeafListNode((LeafListSchemaNode) node, stack, definitions,
                                 definitionNames, oaversion);
 
                     } else if (node instanceof ChoiceSchemaNode) {
                         for (final CaseSchemaNode variant : ((ChoiceSchemaNode) node).getCases()) {
+                            stack.enterSchemaTree(variant.getQName());
                             processChoiceNode(variant.getChildNodes(), parentName, definitions, definitionNames,
-                                    isConfig, schemaContext, properties, oaversion);
+                                    isConfig, stack, properties, oaversion);
+                            stack.exit();
                         }
+                        stack.exit();
+                        // FIXME dangerous statement here! Try to rework without continue.
                         continue;
-
                     } else {
                         throw new IllegalArgumentException("Unknown DataSchemaNode type: " + node.getClass());
                     }
                     properties.set(propertyName, property);
                 }
             }
+            stack.exit();
         }
         parentNode.set(PROPERTIES_KEY, properties);
         setRequiredIfNotEmpty(parentNode, required);
         return properties;
     }
 
-    private ObjectNode processLeafListNode(final LeafListSchemaNode listNode, final SchemaContext schemaContext,
+    private ObjectNode processLeafListNode(final LeafListSchemaNode listNode, final SchemaInferenceStack stack,
                                            final ObjectNode definitions, final DefinitionNames definitionNames,
                                            final OAversion oaversion) {
         final ObjectNode props = JsonNodeFactory.instance.objectNode();
@@ -525,7 +536,7 @@ public class DefinitionGenerator {
         final Optional<ElementCountConstraint> optConstraint = listNode.getElementCountConstraint();
         processElementCount(optConstraint, props);
 
-        processTypeDef(listNode.getType(), listNode, itemsVal, schemaContext, definitions, definitionNames, oaversion);
+        processTypeDef(listNode.getType(), listNode, itemsVal, stack, definitions, definitionNames, oaversion);
         props.set(ITEMS_KEY, itemsVal);
 
         props.put(DESCRIPTION_KEY, listNode.getDescription().orElse(""));
@@ -536,9 +547,10 @@ public class DefinitionGenerator {
     private void processChoiceNode(
             final Iterable<? extends DataSchemaNode> nodes, final String parentName, final ObjectNode definitions,
             final DefinitionNames definitionNames, final boolean isConfig,
-            final SchemaContext schemaContext, final ObjectNode properties, final OAversion oaversion)
+            final SchemaInferenceStack stack, final ObjectNode properties, final OAversion oaversion)
             throws IOException {
         for (final DataSchemaNode node : nodes) {
+            stack.enterSchemaTree(node.getQName());
             /*
                 Add module name prefix to property name, when needed, when ServiceNow can process colons,
                 use RestDocGenUtil#resolveNodesName for creating property name
@@ -552,7 +564,7 @@ public class DefinitionGenerator {
              */
             if (node instanceof LeafSchemaNode) {
                 processLeafNode((LeafSchemaNode) node, name, properties,
-                        JsonNodeFactory.instance.arrayNode(), schemaContext, definitions, definitionNames, oaversion);
+                        JsonNodeFactory.instance.arrayNode(), stack, definitions, definitionNames, oaversion);
             } else if (node instanceof AnyxmlSchemaNode) {
                 processAnyXMLNode((AnyxmlSchemaNode) node, name, properties,
                         JsonNodeFactory.instance.arrayNode());
@@ -562,19 +574,19 @@ public class DefinitionGenerator {
             } else {
                 if (node instanceof ListSchemaNode || node instanceof ContainerSchemaNode) {
                     property = processDataNodeContainer((DataNodeContainer) node, parentName, definitions,
-                            definitionNames, isConfig, schemaContext, oaversion);
+                            definitionNames, isConfig, stack, oaversion);
                     if (!isConfig) {
-                        processActionNodeContainer(node, parentName, definitions, definitionNames, schemaContext,
+                        processActionNodeContainer(node, parentName, definitions, definitionNames, stack,
                                 oaversion);
                     }
                 } else if (node instanceof LeafListSchemaNode) {
-                    property = processLeafListNode((LeafListSchemaNode) node, schemaContext, definitions,
+                    property = processLeafListNode((LeafListSchemaNode) node, stack, definitions,
                             definitionNames, oaversion);
 
                 } else if (node instanceof ChoiceSchemaNode) {
                     for (final CaseSchemaNode variant : ((ChoiceSchemaNode) node).getCases()) {
                         processChoiceNode(variant.getChildNodes(), parentName, definitions, definitionNames, isConfig,
-                                schemaContext, properties, oaversion);
+                                stack, properties, oaversion);
                     }
                     continue;
                 } else {
@@ -582,6 +594,7 @@ public class DefinitionGenerator {
                 }
                 properties.set(name, property);
             }
+            stack.exit();
         }
     }
 
@@ -607,7 +620,7 @@ public class DefinitionGenerator {
 
     private ObjectNode processLeafNode(final LeafSchemaNode leafNode, final String jsonLeafName,
                                        final ObjectNode properties, final ArrayNode required,
-                                       final SchemaContext schemaContext, final ObjectNode definitions,
+                                       final SchemaInferenceStack stack, final ObjectNode definitions,
                                        final DefinitionNames definitionNames, final OAversion oaversion) {
         final ObjectNode property = JsonNodeFactory.instance.objectNode();
 
@@ -620,7 +633,7 @@ public class DefinitionGenerator {
             property.put(DESCRIPTION_KEY, leafDescription);
         }
 
-        processTypeDef(leafNode.getType(), leafNode, property, schemaContext, definitions, definitionNames, oaversion);
+        processTypeDef(leafNode.getType(), leafNode, property, stack, definitions, definitionNames, oaversion);
         properties.set(jsonLeafName, property);
         property.set(XML_KEY, buildXmlParameter(leafNode));
         processMandatory(leafNode, jsonLeafName, required);
@@ -663,7 +676,7 @@ public class DefinitionGenerator {
     }
 
     private String processTypeDef(final TypeDefinition<?> leafTypeDef, final DataSchemaNode node,
-                                  final ObjectNode property, final SchemaContext schemaContext,
+                                  final ObjectNode property, final SchemaInferenceStack stack,
                                   final ObjectNode definitions, final DefinitionNames definitionNames,
                                   final OAversion oaversion) {
         final String jsonType;
@@ -678,7 +691,7 @@ public class DefinitionGenerator {
 
         } else if (leafTypeDef instanceof IdentityrefTypeDefinition) {
             jsonType = processIdentityRefType((IdentityrefTypeDefinition) leafTypeDef, property, definitions,
-                    definitionNames, oaversion, schemaContext);
+                    definitionNames, oaversion, stack.getEffectiveModelContext());
 
         } else if (leafTypeDef instanceof StringTypeDefinition) {
             jsonType = processStringType(leafTypeDef, property, node.getQName().getLocalName());
@@ -689,15 +702,15 @@ public class DefinitionGenerator {
         } else if (leafTypeDef instanceof EmptyTypeDefinition) {
             jsonType = OBJECT_TYPE;
         } else if (leafTypeDef instanceof LeafrefTypeDefinition) {
-            return processTypeDef(SchemaContextUtil.getBaseTypeForLeafRef((LeafrefTypeDefinition) leafTypeDef,
-                    schemaContext, node), node, property, schemaContext, definitions, definitionNames, oaversion);
+            return processTypeDef(stack.resolveLeafref((LeafrefTypeDefinition) leafTypeDef), node, property,
+                stack, definitions, definitionNames, oaversion);
         } else if (leafTypeDef instanceof BooleanTypeDefinition) {
             jsonType = BOOLEAN_TYPE;
             setDefaultValue(property, true);
         } else if (leafTypeDef instanceof RangeRestrictedTypeDefinition) {
-            jsonType = processNumberType((RangeRestrictedTypeDefinition) leafTypeDef, property);
+            jsonType = processNumberType((RangeRestrictedTypeDefinition<?, ?>) leafTypeDef, property);
         } else if (leafTypeDef instanceof InstanceIdentifierTypeDefinition) {
-            jsonType = processInstanceIdentifierType(node, property, schemaContext);
+            jsonType = processInstanceIdentifierType(node, property, stack.getEffectiveModelContext());
         } else {
             jsonType = STRING_TYPE;
         }
@@ -714,7 +727,7 @@ public class DefinitionGenerator {
                         setDefaultValue(property, new BigDecimal(stringDefaultValue));
                     } else if (leafTypeDef instanceof RangeRestrictedTypeDefinition) {
                         //uint8,16,32 int8,16,32,64
-                        if (isHexadecimalOrOctal((RangeRestrictedTypeDefinition)leafTypeDef)) {
+                        if (isHexadecimalOrOctal((RangeRestrictedTypeDefinition<?, ?>)leafTypeDef)) {
                             setDefaultValue(property, stringDefaultValue);
                         } else {
                             setDefaultValue(property, Long.valueOf(stringDefaultValue));
@@ -751,7 +764,7 @@ public class DefinitionGenerator {
 
     private String processIdentityRefType(final IdentityrefTypeDefinition leafTypeDef, final ObjectNode property,
                                           final ObjectNode definitions, final DefinitionNames definitionNames,
-                                          final OAversion oaversion, final SchemaContext schemaContext) {
+                                          final OAversion oaversion, final EffectiveModelContext schemaContext) {
         final String definitionName;
         if (isImported(leafTypeDef)) {
             definitionName = addImportedIdentity(leafTypeDef, definitions, definitionNames, schemaContext);
@@ -765,7 +778,7 @@ public class DefinitionGenerator {
 
     private static String addImportedIdentity(final IdentityrefTypeDefinition leafTypeDef,
                                               final ObjectNode definitions, final DefinitionNames definitionNames,
-                                              final SchemaContext context) {
+                                              final EffectiveModelContext context) {
         final IdentitySchemaNode idNode = leafTypeDef.getIdentities().iterator().next();
         final String identityName = idNode.getQName().getLocalName();
         if (!definitionNames.isListedNode(idNode)) {
@@ -779,7 +792,8 @@ public class DefinitionGenerator {
         }
     }
 
-    private static ObjectNode buildIdentityObject(final IdentitySchemaNode idNode, final SchemaContext context) {
+    private static ObjectNode buildIdentityObject(final IdentitySchemaNode idNode,
+            final EffectiveModelContext context) {
         final ObjectNode identityObj = JsonNodeFactory.instance.objectNode();
         final String identityName = idNode.getQName().getLocalName();
         LOG.debug("Processing Identity: {}", identityName);
@@ -848,7 +862,8 @@ public class DefinitionGenerator {
         return STRING_TYPE;
     }
 
-    private String processNumberType(final RangeRestrictedTypeDefinition leafTypeDef, final ObjectNode property) {
+    private static String processNumberType(final RangeRestrictedTypeDefinition<?, ?> leafTypeDef,
+            final ObjectNode property) {
         final Optional<Number> maybeLower = ((RangeRestrictedTypeDefinition<?, ?>) leafTypeDef).getRangeConstraint()
                 .map(RangeConstraint::getAllowedRanges).map(RangeSet::span).map(Range::lowerEndpoint);
 
@@ -880,7 +895,7 @@ public class DefinitionGenerator {
         return INTEGER_TYPE;
     }
 
-    private boolean isHexadecimalOrOctal(RangeRestrictedTypeDefinition typeDef) {
+    private static boolean isHexadecimalOrOctal(final RangeRestrictedTypeDefinition<?, ?> typeDef) {
         final Optional<?> optDefaultValue = typeDef.getDefaultValue();
         if (optDefaultValue.isPresent()) {
             final String defaultValue = (String)optDefaultValue.get();
@@ -889,22 +904,22 @@ public class DefinitionGenerator {
         return false;
     }
 
-    private String processInstanceIdentifierType(final DataSchemaNode node, final ObjectNode property,
-                                                 final SchemaContext schemaContext) {
-        SchemaPath path = node.getPath();
-
-        while (path.getParent() != null && path.getParent().getPathFromRoot().iterator().hasNext()) {
-            path = path.getParent();
+    private static String processInstanceIdentifierType(final DataSchemaNode node, final ObjectNode property,
+                                                        final EffectiveModelContext schemaContext) {
+        // create example instance-identifier to the first container of node's module if exists or leave it empty
+        final var module = schemaContext.findModule(node.getQName().getModule());
+        if (module.isPresent()) {
+            final var container = module.get().getChildNodes().stream()
+                    .filter(n -> n instanceof ContainerSchemaNode)
+                    .findFirst();
+            container.ifPresent(c -> setDefaultValue(property, String.format("/%s:%s", module.get().getPrefix(),
+                    c.getQName().getLocalName())));
         }
 
-        final QName rootContainer = path.getLastComponent();
-        final String rootContainerName = rootContainer.getLocalName();
-        final String prefix = schemaContext.findModule(rootContainer.getModule()).get().getPrefix();
-        setDefaultValue(property, String.format("/%s:%s", prefix, rootContainerName));
         return STRING_TYPE;
     }
 
-    private String processUnionType(final UnionTypeDefinition unionType) {
+    private static String processUnionType(final UnionTypeDefinition unionType) {
         boolean isStringTakePlace = false;
         boolean isNumberTakePlace = false;
         boolean isBooleanTakePlace = false;
@@ -937,7 +952,7 @@ public class DefinitionGenerator {
         return NUMBER_TYPE;
     }
 
-    private static ObjectNode buildXmlParameter(SchemaNode node) {
+    private static ObjectNode buildXmlParameter(final SchemaNode node) {
         final ObjectNode xml = JsonNodeFactory.instance.objectNode();
         final QName qName = node.getQName();
         xml.put(NAME_KEY, qName.getLocalName());