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) {
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);
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 EffectiveModelContext 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 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 EffectiveModelContext schemaContext, final OAversion oaversion)
+ 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 EffectiveModelContext 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();
processTopData(filename, discriminator, definitions, container, oaversion);
}
+ stack.exit();
}
private static ObjectNode processTopData(final String filename, final String discriminator,
*/
private static void processIdentities(final Module module, final ObjectNode definitions,
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());
private ObjectNode processDataNodeContainer(final DataNodeContainer dataNode, final String parentName,
final ObjectNode definitions, final DefinitionNames definitionNames,
- final boolean isConfig, final EffectiveModelContext 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();
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;
private ObjectNode processChildren(
final ObjectNode parentNode, final Collection<? extends DataSchemaNode> nodes, final String parentName,
final ObjectNode definitions, final DefinitionNames definitionNames, final boolean isConfig,
- final EffectiveModelContext 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,
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 EffectiveModelContext 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();
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(""));
private void processChoiceNode(
final Iterable<? extends DataSchemaNode> nodes, final String parentName, final ObjectNode definitions,
final DefinitionNames definitionNames, final boolean isConfig,
- final EffectiveModelContext 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
*/
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());
} 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 {
}
properties.set(name, property);
}
+ stack.exit();
}
}
private ObjectNode processLeafNode(final LeafSchemaNode leafNode, final String jsonLeafName,
final ObjectNode properties, final ArrayNode required,
- final EffectiveModelContext schemaContext, final ObjectNode definitions,
+ final SchemaInferenceStack stack, final ObjectNode definitions,
final DefinitionNames definitionNames, final OAversion oaversion) {
final ObjectNode property = JsonNodeFactory.instance.objectNode();
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);
}
private String processTypeDef(final TypeDefinition<?> leafTypeDef, final DataSchemaNode node,
- final ObjectNode property, final EffectiveModelContext schemaContext,
+ final ObjectNode property, final SchemaInferenceStack stack,
final ObjectNode definitions, final DefinitionNames definitionNames,
final OAversion oaversion) {
final String jsonType;
} 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());
} else if (leafTypeDef instanceof EmptyTypeDefinition) {
jsonType = OBJECT_TYPE;
} else if (leafTypeDef instanceof LeafrefTypeDefinition) {
- final SchemaInferenceStack stack = SchemaInferenceStack.ofSchemaPath(schemaContext, node.getPath());
return processTypeDef(stack.resolveLeafref((LeafrefTypeDefinition) leafTypeDef), node, property,
- schemaContext, definitions, definitionNames, oaversion);
+ 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);
} else if (leafTypeDef instanceof InstanceIdentifierTypeDefinition) {
- jsonType = processInstanceIdentifierType(node, property, schemaContext);
+ jsonType = processInstanceIdentifierType(node, property, stack.getEffectiveModelContext());
} else {
jsonType = STRING_TYPE;
}