X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=restconf%2Fsal-rest-docgen%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Frest%2Fdoc%2Fimpl%2FDefinitionGenerator.java;h=56c2638edeada5a227ab80486dea29c6e3c1baea;hb=416423826021c9336b1454ca89906d855d948ac7;hp=b54cf0b47b0b89e5b7f97e7107526e9827f0d466;hpb=c3d15396d264b083c0f8755e289dcdbbc812f22d;p=netconf.git diff --git a/restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/DefinitionGenerator.java b/restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/DefinitionGenerator.java index b54cf0b47b..56c2638ede 100644 --- a/restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/DefinitionGenerator.java +++ b/restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/DefinitionGenerator.java @@ -41,9 +41,11 @@ import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; +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; @@ -53,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; @@ -82,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; @@ -138,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 { @@ -155,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 { @@ -167,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) { @@ -208,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); @@ -224,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 ContainerSchemaNode container, final String operationName, + 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(); @@ -293,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; @@ -340,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 idNodes = module.getIdentities(); LOG.debug("Processing Identities for module {} . Found {} identity statements", moduleName, idNodes.size()); @@ -356,7 +364,7 @@ public class DefinitionGenerator { } private static void populateEnumWithDerived(final Collection 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); @@ -365,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 containerChildren = dataNode.getChildNodes(); @@ -375,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; @@ -421,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) { @@ -438,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 keyDefinition = listNode.getKeyDefinition(); final Set keys = listNode.getChildNodes().stream() @@ -463,10 +471,11 @@ public class DefinitionGenerator { private ObjectNode processChildren( final ObjectNode parentNode, final Collection 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, @@ -476,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(); @@ -524,7 +536,7 @@ public class DefinitionGenerator { final Optional 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("")); @@ -535,9 +547,10 @@ public class DefinitionGenerator { private void processChoiceNode( final Iterable 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 @@ -551,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()); @@ -561,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 { @@ -581,6 +594,7 @@ public class DefinitionGenerator { } properties.set(name, property); } + stack.exit(); } } @@ -606,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(); @@ -619,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); @@ -662,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; @@ -677,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()); @@ -688,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; } @@ -713,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)); @@ -750,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); @@ -764,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)) { @@ -778,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); @@ -833,15 +848,22 @@ public class DefinitionGenerator { final PatternConstraint pattern = type.getPatternConstraints().iterator().next(); String regex = pattern.getJavaPatternString(); regex = regex.substring(1, regex.length() - 1); - final Generex generex = new Generex(regex); - setDefaultValue(property, generex.random()); + String defaultValue = ""; + try { + final Generex generex = new Generex(regex); + defaultValue = generex.random(); + } catch (IllegalArgumentException ex) { + LOG.warn("Cannot create example string for type: {} with regex: {}.", stringType.getQName(), regex); + } + setDefaultValue(property, defaultValue); } else { setDefaultValue(property, "Some " + nodeName); } return STRING_TYPE; } - private String processNumberType(final RangeRestrictedTypeDefinition leafTypeDef, final ObjectNode property) { + private static String processNumberType(final RangeRestrictedTypeDefinition leafTypeDef, + final ObjectNode property) { final Optional maybeLower = ((RangeRestrictedTypeDefinition) leafTypeDef).getRangeConstraint() .map(RangeConstraint::getAllowedRanges).map(RangeSet::span).map(Range::lowerEndpoint); @@ -873,31 +895,31 @@ 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()); + final String defaultValue = (String)optDefaultValue.get(); return defaultValue.startsWith("0") || defaultValue.startsWith("-0"); } 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; @@ -930,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());