X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fcodec%2Fxml%2FElementInstanceIdentifierParser.java;h=4274f6db4230181bf8046195baf05c5cc7880cd4;hb=0c092cbca774271a87578432212fb398f61543a4;hp=11944faad8d136a4a2b0d2eed484abd9aa88195c;hpb=54b85dc59a410c1cb945cc124367f131f2b6e384;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/ElementInstanceIdentifierParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/ElementInstanceIdentifierParser.java index 11944faad8..4274f6db42 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/ElementInstanceIdentifierParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/ElementInstanceIdentifierParser.java @@ -8,22 +8,47 @@ package org.opendaylight.yangtools.yang.data.impl.codec.xml; import com.google.common.base.Preconditions; - import java.net.URI; - import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec; import org.opendaylight.yangtools.yang.data.util.AbstractStringInstanceIdentifierCodec; +import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; +import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; import org.w3c.dom.Element; final class ElementInstanceIdentifierParser extends AbstractStringInstanceIdentifierCodec { private final SchemaContext schema; private final Element element; + private final DataSchemaContextTree dataContextTree; ElementInstanceIdentifierParser(final SchemaContext schema, final Element element) { this.element = Preconditions.checkNotNull(element); this.schema = Preconditions.checkNotNull(schema); + this.dataContextTree = DataSchemaContextTree.from(schema); + } + + @Override + protected Object deserializeKeyValue(final DataSchemaNode schemaNode, final String value) { + Preconditions.checkNotNull(schemaNode, "schemaNode cannot be null"); + Preconditions.checkArgument(schemaNode instanceof LeafSchemaNode, "schemaNode must be of type LeafSchemaNode"); + TypeDefinition originalType = XmlUtils.resolveBaseTypeFrom(((LeafSchemaNode) schemaNode).getType()); + if (originalType instanceof IdentityrefTypeDefinition) { + return new ElementIdentityrefParser(schema, element).deserialize(value); + } else if (originalType instanceof LeafrefTypeDefinition) { + originalType = SchemaContextUtil.getBaseTypeForLeafRef((LeafrefTypeDefinition) originalType, schema, + schemaNode); + } + final TypeDefinitionAwareCodec> keyCodec = + XmlUtils.DEFAULT_XML_CODEC_PROVIDER.codecFor(originalType); + Preconditions.checkState(keyCodec != null, String.format("Cannot find codec for type '%s'.", originalType)); + return keyCodec.deserialize(value); } @Override @@ -42,4 +67,9 @@ final class ElementInstanceIdentifierParser extends AbstractStringInstanceIdenti return QName.create(module.getQNameModule(), localName); } + @Override + protected DataSchemaContextTree getDataContextTree() { + return dataContextTree; + } + }