- private static final String XPATH_DELIMITER_REGEX = "\\/";
- private static final String XPATH_NODE_KEY_ATTRIBUTES_REGEX = "\\[.*?\\]";
-
- /**
- * Parses data into Collection of NormalizedNode according to given schema context.
- *
- * @param nodeData data string
- * @param schemaContext schema context describing associated data model
- * @return the NormalizedNode object
- */
- public static ContainerNode parseData(final ContentType contentType, final String nodeData,
- final SchemaContext schemaContext) {
- if (contentType == ContentType.JSON) {
- return parseJsonData(nodeData, schemaContext, Optional.empty());
- }
- return parseXmlData(XmlFileUtils.prepareXmlContent(nodeData, schemaContext), schemaContext,
- Optional.empty());
- }
-
- /**
- * Parses data into NormalizedNode according to given schema context.
- *
- * @param nodeData data string
- * @param schemaContext schema context describing associated data model
- * @return the NormalizedNode object
- */
- public static ContainerNode parseData(final ContentType contentType, final String nodeData,
- final SchemaContext schemaContext, final String parentNodeXpath) {
- final DataSchemaNode parentSchemaNode =
- (DataSchemaNode) getDataSchemaNodeAndIdentifiersByXpath(parentNodeXpath, schemaContext)
- .get("dataSchemaNode");
- final Collection<QName> dataSchemaNodeIdentifiers =
- (Collection<QName>) getDataSchemaNodeAndIdentifiersByXpath(parentNodeXpath, schemaContext)
- .get("dataSchemaNodeIdentifiers");
- if (contentType == ContentType.JSON) {
- return parseJsonData(nodeData, schemaContext, Optional.of(dataSchemaNodeIdentifiers));
- }
- return parseXmlData(XmlFileUtils.prepareXmlContent(nodeData, parentSchemaNode, parentNodeXpath), schemaContext,
- Optional.of(dataSchemaNodeIdentifiers));
- }
-
- /**
- * Parses data into Collection of NormalizedNode according to given schema context.
- *
- * @param jsonData json data as string
- * @param schemaContext schema context describing associated data model
- * @return the Collection of NormalizedNode object
- */
- public static ContainerNode parseJsonData(final String jsonData, final SchemaContext schemaContext) {
- return parseJsonData(jsonData, schemaContext, Optional.empty());
- }
-
- /**
- * Parses jsonData into Collection of NormalizedNode according to given schema context.
- *
- * @param jsonData json data fragment as string
- * @param schemaContext schema context describing associated data model
- * @param parentNodeXpath the xpath referencing the parent node current data fragment belong to
- * @return the NormalizedNode object
- */
- public static ContainerNode parseJsonData(final String jsonData, final SchemaContext schemaContext,
- final String parentNodeXpath) {
- final Collection<QName> dataSchemaNodeIdentifiers =
- (Collection<QName>) getDataSchemaNodeAndIdentifiersByXpath(parentNodeXpath, schemaContext)
- .get("dataSchemaNodeIdentifiers");
- return parseJsonData(jsonData, schemaContext, Optional.of(dataSchemaNodeIdentifiers));
- }
-
- private static ContainerNode parseJsonData(final String jsonData, final SchemaContext schemaContext,
- final Optional<Collection<QName>> dataSchemaNodeIdentifiers) {
- final JSONCodecFactory jsonCodecFactory = JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02
- .getShared((EffectiveModelContext) schemaContext);
- final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifier, ContainerNode> dataContainerNodeBuilder =
- Builders.containerBuilder()
- .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(schemaContext.getQName()));
- final NormalizedNodeStreamWriter normalizedNodeStreamWriter = ImmutableNormalizedNodeStreamWriter
- .from(dataContainerNodeBuilder);
- final JsonReader jsonReader = new JsonReader(new StringReader(jsonData));
- final JsonParserStream jsonParserStream;
-
- if (dataSchemaNodeIdentifiers.isPresent()) {
- final EffectiveModelContext effectiveModelContext = ((EffectiveModelContext) schemaContext);
- final EffectiveStatementInference effectiveStatementInference =
- SchemaInferenceStack.of(effectiveModelContext,
- SchemaNodeIdentifier.Absolute.of(dataSchemaNodeIdentifiers.get())).toInference();
- jsonParserStream =
- JsonParserStream.create(normalizedNodeStreamWriter, jsonCodecFactory, effectiveStatementInference);
- } else {
- jsonParserStream = JsonParserStream.create(normalizedNodeStreamWriter, jsonCodecFactory);
- }
-
- try {
- jsonParserStream.parse(jsonReader);
- jsonParserStream.close();
- } catch (final IOException | JsonSyntaxException exception) {
- throw new DataValidationException(
- "Failed to parse json data: " + jsonData, exception.getMessage(), exception);
- } catch (final IllegalStateException | IllegalArgumentException exception) {
- throw new DataValidationException(
- "Failed to parse json data. Unsupported xpath or json data:" + jsonData, exception
- .getMessage(), exception);
- }
- return dataContainerNodeBuilder.build();
- }
-
- private static ContainerNode parseXmlData(final String xmlData, final SchemaContext schemaContext,
- final Optional<Collection<QName>> dataSchemaNodeIdentifiers) {
- final XMLInputFactory factory = XMLInputFactory.newInstance();
- factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
- final NormalizedNodeResult normalizedNodeResult = new NormalizedNodeResult();
- final NormalizedNodeStreamWriter normalizedNodeStreamWriter = ImmutableNormalizedNodeStreamWriter
- .from(normalizedNodeResult);
-
- final XmlParserStream xmlParser;
- final EffectiveModelContext effectiveModelContext = ((EffectiveModelContext) schemaContext);
-
- if (dataSchemaNodeIdentifiers.isPresent()) {
- final EffectiveStatementInference effectiveStatementInference =
- SchemaInferenceStack.of(effectiveModelContext,
- SchemaNodeIdentifier.Absolute.of(dataSchemaNodeIdentifiers.get())).toInference();
- xmlParser = XmlParserStream.create(normalizedNodeStreamWriter, effectiveStatementInference);
- } else {
- xmlParser = XmlParserStream.create(normalizedNodeStreamWriter, effectiveModelContext);
- }
-
- try {
- final XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(xmlData));
- xmlParser.parse(reader);
- xmlParser.close();
- } catch (final XMLStreamException | URISyntaxException | IOException
- | SAXException | NullPointerException exception) {
- throw new DataValidationException(
- "Failed to parse xml data: " + xmlData, exception.getMessage(), exception);
- }
- final NormalizedNode normalizedNode = getFirstChildXmlRoot(normalizedNodeResult.getResult());
- return Builders.containerBuilder().withChild((DataContainerChild) normalizedNode)
- .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(schemaContext.getQName())).build();
- }
-