- /**
- * @deprecated method will be removed in Lithium release
- * we don't wish to use Node and CompositeNode anywhere
- */
- @Deprecated
- public CompositeNode normalizeNode(final Node<?> node, final DataSchemaNode schema, final DOMMountPoint mountPoint) {
- if (schema == null) {
- final String localName = node == null ? null :
- node instanceof NodeWrapper ? ((NodeWrapper<?>)node).getLocalName() :
- node.getNodeType().getLocalName();
-
- throw new RestconfDocumentedException("Data schema node was not found for " + localName,
- ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
- }
-
- if (!(schema instanceof DataNodeContainer)) {
- throw new RestconfDocumentedException("Root element has to be container or list yang datatype.",
- ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
- }
-
- if ((node instanceof NodeWrapper<?>)) {
- NodeWrapper<?> nodeWrap = (NodeWrapper<?>) node;
- final boolean isChangeAllowed = ((NodeWrapper<?>) node).isChangeAllowed();
- if (isChangeAllowed) {
- nodeWrap = topLevelElementAsCompositeNodeWrapper((NodeWrapper<?>) node, schema);
- try {
- this.normalizeNode(nodeWrap, schema, null, mountPoint);
- } catch (final IllegalArgumentException e) {
- final RestconfDocumentedException restconfDocumentedException = new RestconfDocumentedException(e.getMessage(), ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
- restconfDocumentedException.addSuppressed(e);
- throw restconfDocumentedException;
- }
- if (nodeWrap instanceof CompositeNodeWrapper) {
- return ((CompositeNodeWrapper) nodeWrap).unwrap();
- }
- }
- }
-
- if (node instanceof CompositeNode) {
- return (CompositeNode) node;
- }
-
- throw new RestconfDocumentedException("Top level element is not interpreted as composite node.",
- ErrorType.APPLICATION, ErrorTag.INVALID_VALUE);
- }
-
- private void normalizeNode(final NodeWrapper<? extends Object> nodeBuilder, final DataSchemaNode schema,
- final QName previousAugment, final DOMMountPoint mountPoint) {
- if (schema == null) {
- throw new RestconfDocumentedException("Data has bad format.\n\"" + nodeBuilder.getLocalName()
- + "\" does not exist in yang schema.", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
- }
-
- QName currentAugment = null;
- if (nodeBuilder.getQname() != null) {
- currentAugment = previousAugment;
- } else {
- currentAugment = normalizeNodeName(nodeBuilder, schema, previousAugment, mountPoint);
- if (nodeBuilder.getQname() == null) {
- throw new RestconfDocumentedException(
- "Data has bad format.\nIf data is in XML format then namespace for \""
- + nodeBuilder.getLocalName() + "\" should be \"" + schema.getQName().getNamespace()
- + "\".\n" + "If data is in JSON format then module name for \""
- + nodeBuilder.getLocalName() + "\" should be corresponding to namespace \""
- + schema.getQName().getNamespace() + "\".", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
- }
- }
-
- if (nodeBuilder instanceof CompositeNodeWrapper) {
- if (schema instanceof DataNodeContainer) {
- normalizeCompositeNode((CompositeNodeWrapper) nodeBuilder, (DataNodeContainer) schema, mountPoint,
- currentAugment);
- } else if (schema instanceof AnyXmlSchemaNode) {
- normalizeAnyXmlNode((CompositeNodeWrapper) nodeBuilder, (AnyXmlSchemaNode) schema);
- }
- } else if (nodeBuilder instanceof SimpleNodeWrapper) {
- normalizeSimpleNode((SimpleNodeWrapper) nodeBuilder, schema, mountPoint);
- } else if ((nodeBuilder instanceof EmptyNodeWrapper)) {
- normalizeEmptyNode((EmptyNodeWrapper) nodeBuilder, schema);
- }
- }
-
- private void normalizeAnyXmlNode(final CompositeNodeWrapper compositeNode, final AnyXmlSchemaNode schema) {
- final List<NodeWrapper<?>> children = compositeNode.getValues();
- for (final NodeWrapper<? extends Object> child : children) {
- child.setNamespace(schema.getQName().getNamespace());
- if (child instanceof CompositeNodeWrapper) {
- normalizeAnyXmlNode((CompositeNodeWrapper) child, schema);
- }
- }
- }
-
- private void normalizeEmptyNode(final EmptyNodeWrapper emptyNodeBuilder, final DataSchemaNode schema) {
- if ((schema instanceof LeafSchemaNode)) {
- emptyNodeBuilder.setComposite(false);
- } else {
- if ((schema instanceof ContainerSchemaNode)) {
- // FIXME: Add presence check
- emptyNodeBuilder.setComposite(true);
- }
- }
- }
-
- private void normalizeSimpleNode(final SimpleNodeWrapper simpleNode, final DataSchemaNode schema,
- final DOMMountPoint mountPoint) {
- final Object value = simpleNode.getValue();
- Object inputValue = value;
- final TypeDef typeDef = this.typeDefinition(schema);
- TypeDefinition<? extends Object> typeDefinition = typeDef != null ? typeDef.typedef : null;
-
- // For leafrefs, extract the type it is pointing to
- if(typeDefinition instanceof LeafrefTypeDefinition) {
- if (schema.getQName().equals(typeDef.qName)) {
- typeDefinition = SchemaContextUtil.getBaseTypeForLeafRef(((LeafrefTypeDefinition) typeDefinition), mountPoint == null ? controllerContext.getGlobalSchema() : mountPoint.getSchemaContext(), schema);
- } else {
- typeDefinition = SchemaContextUtil.getBaseTypeForLeafRef(((LeafrefTypeDefinition) typeDefinition), mountPoint == null ? controllerContext.getGlobalSchema() : mountPoint.getSchemaContext(), typeDef.qName);
- }
- }
-
- if (typeDefinition instanceof IdentityrefTypeDefinition) {
- inputValue = parseToIdentityValuesDTO(simpleNode, value, inputValue);
- }
-
- Object outputValue = inputValue;
-
- if (typeDefinition != null) {
- final Codec<Object, Object> codec = RestCodec.from(typeDefinition, mountPoint);
- outputValue = codec == null ? null : codec.deserialize(inputValue);
- }
-
- simpleNode.setValue(outputValue);
- }
-
- private Object parseToIdentityValuesDTO(final SimpleNodeWrapper simpleNode, final Object value, Object inputValue) {
- if ((value instanceof String)) {
- inputValue = new IdentityValuesDTO(simpleNode.getNamespace().toString(), (String) value, null,
- (String) value);
- } // else value is already instance of IdentityValuesDTO
- return inputValue;
- }
-
- private void normalizeCompositeNode(final CompositeNodeWrapper compositeNodeBuilder,
- final DataNodeContainer schema, final DOMMountPoint mountPoint, final QName currentAugment) {
- final List<NodeWrapper<?>> children = compositeNodeBuilder.getValues();
- checkNodeMultiplicityAccordingToSchema(schema, children);
- for (final NodeWrapper<? extends Object> child : children) {
- final List<DataSchemaNode> potentialSchemaNodes = ControllerContext.findInstanceDataChildrenByName(
- schema, child.getLocalName());
-
- if (potentialSchemaNodes.size() > 1 && child.getNamespace() == null) {
- final StringBuilder builder = new StringBuilder();
- for (final DataSchemaNode potentialSchemaNode : potentialSchemaNodes) {
- builder.append(" ").append(potentialSchemaNode.getQName().getNamespace().toString()).append("\n");
- }
-
- throw new RestconfDocumentedException("Node \"" + child.getLocalName()
- + "\" is added as augment from more than one module. "
- + "Therefore node must have namespace (XML format) or module name (JSON format)."
- + "\nThe node is added as augment from modules with namespaces:\n" + builder,
- ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
- }
-
- boolean rightNodeSchemaFound = false;
- for (final DataSchemaNode potentialSchemaNode : potentialSchemaNodes) {
- if (!rightNodeSchemaFound) {
- final QName potentialCurrentAugment = normalizeNodeName(child, potentialSchemaNode,
- currentAugment, mountPoint);
- if (child.getQname() != null) {
- this.normalizeNode(child, potentialSchemaNode, potentialCurrentAugment, mountPoint);
- rightNodeSchemaFound = true;
- }
- }
- }
-
- if (!rightNodeSchemaFound) {
- throw new RestconfDocumentedException("Schema node \"" + child.getLocalName()
- + "\" was not found in module.", ErrorType.APPLICATION, ErrorTag.UNKNOWN_ELEMENT);
- }
- }
-
- if ((schema instanceof ListSchemaNode)) {
- final ListSchemaNode listSchemaNode = (ListSchemaNode) schema;
- final List<QName> listKeys = listSchemaNode.getKeyDefinition();
- for (final QName listKey : listKeys) {
- boolean foundKey = false;
- for (final NodeWrapper<? extends Object> child : children) {
- if (Objects.equal(child.unwrap().getNodeType().getLocalName(), listKey.getLocalName())) {
- foundKey = true;
- }
- }
-
- if (!foundKey) {
- throw new RestconfDocumentedException("Missing key in URI \"" + listKey.getLocalName()
- + "\" of list \"" + listSchemaNode.getQName().getLocalName() + "\"", ErrorType.PROTOCOL,
- ErrorTag.DATA_MISSING);
- }
- }
- }
- }
-
- private void checkNodeMultiplicityAccordingToSchema(final DataNodeContainer dataNodeContainer,
- final List<NodeWrapper<?>> nodes) {
- final Map<String, Integer> equalNodeNamesToCounts = new HashMap<String, Integer>();
- for (final NodeWrapper<?> child : nodes) {
- Integer count = equalNodeNamesToCounts.get(child.getLocalName());
- equalNodeNamesToCounts.put(child.getLocalName(), count == null ? 1 : ++count);
- }
-
- for (final DataSchemaNode childSchemaNode : dataNodeContainer.getChildNodes()) {
- if (childSchemaNode instanceof ContainerSchemaNode || childSchemaNode instanceof LeafSchemaNode) {
- final String localName = childSchemaNode.getQName().getLocalName();
- final Integer count = equalNodeNamesToCounts.get(localName);
- if (count != null && count > 1) {
- throw new RestconfDocumentedException("Multiple input data elements were specified for '"
- + childSchemaNode.getQName().getLocalName()
- + "'. The data for this element type can only be specified once.", ErrorType.APPLICATION,
- ErrorTag.BAD_ELEMENT);
- }
- }
- }
- }
-
- private QName normalizeNodeName(final NodeWrapper<? extends Object> nodeBuilder, final DataSchemaNode schema,
- final QName previousAugment, final DOMMountPoint mountPoint) {
- QName validQName = schema.getQName();
- QName currentAugment = previousAugment;
- if (schema.isAugmenting()) {
- currentAugment = schema.getQName();
- } else if (previousAugment != null
- && !Objects.equal(schema.getQName().getNamespace(), previousAugment.getNamespace())) {
- validQName = QName.create(currentAugment, schema.getQName().getLocalName());
- }
-
- String moduleName = null;
- if (mountPoint == null) {
- moduleName = controllerContext.findModuleNameByNamespace(validQName.getNamespace());
- } else {
- moduleName = controllerContext.findModuleNameByNamespace(mountPoint, validQName.getNamespace());
- }
-
- if (nodeBuilder.getNamespace() == null || Objects.equal(nodeBuilder.getNamespace(), validQName.getNamespace())
- || Objects.equal(nodeBuilder.getNamespace().toString(), moduleName)) {
- /*
- * || Note : this check is wrong -
- * can never be true as it compares
- * a URI with a String not sure what
- * the intention is so commented out
- * ... Objects . equal ( nodeBuilder
- * . getNamespace ( ) ,
- * MOUNT_POINT_MODULE_NAME )
- */
-
- nodeBuilder.setQname(validQName);
- }
-
- return currentAugment;
- }
-
- private URI namespace(final Node<?> data) {
- if (data instanceof NodeWrapper) {
- return ((NodeWrapper<?>) data).getNamespace();
- } else if (data != null) {
- return data.getNodeType().getNamespace();
- } else {
- throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object> asList(data).toString());
- }
- }
-
- private String localName(final Node<?> data) {
- if (data instanceof NodeWrapper) {
- return ((NodeWrapper<?>) data).getLocalName();
- } else if (data != null) {
- return data.getNodeType().getLocalName();
- } else {
- throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object> asList(data).toString());
- }
- }
-
- /**
- * @deprecated method will be removed for Lithium release
- *
- * @param data
- * @return
- */
- @Deprecated
- private String getName(final Node<?> data) {
- if (data instanceof NodeWrapper) {
- return ((NodeWrapper<?>) data).getLocalName();
- } else if (data != null) {
- return data.getNodeType().getLocalName();
- } else {
- throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object> asList(data).toString());
- }
- }
-