From 9549a6b25d1a39cae42e34c32b0a1114e673a91d Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 10 Nov 2017 14:50:11 +0100 Subject: [PATCH] Refactor TypedSchemaNode Factoration of WhenConditionAware is flushing out a mismatch between Annotation and TypedSchemaNode. TypedSchemaNode should really be called TypedDataSchemaNode, as it captures nodes which are valid in datastore contexts and capture real data. Annotation, while sharing the aspect of being type-aware, is not normal data as implied by DataSchemaNode. Notably it does not have a concept of being added by augmentation nor being configuration. In order to reconcile this mismatch, we really need a TypeAware trait, which is mixed in with DataSchemaNode in TypedDataSchemaNode. Annotation mixes it with UnknownSchemaNode -- resulting in more correct interfaces being exposed. Change-Id: Ie45b982c1a6ee3287ce57be34104b8f745a215ae Signed-off-by: Robert Varga --- .../model/api/AnnotationSchemaNode.java | 4 +-- .../yangtools/rfc7952/parser/Annotation.java | 16 ------------ .../data/codec/gson/JSONCodecFactory.java | 6 ++--- .../data/codec/gson/JsonParserStream.java | 6 ++--- .../data/codec/xml/XMLStreamWriterUtils.java | 6 ++--- .../yang/data/codec/xml/XmlParserStream.java | 6 ++--- .../leafref/LeafRefContextTreeBuilder.java | 6 ++--- ...XPathStringParsingPathArgumentBuilder.java | 6 ++--- .../yang/data/jaxen/YangFunctionContext.java | 26 +++++++++---------- .../data/util/codec/AbstractCodecFactory.java | 8 +++--- .../yang/data/util/codec/CodecCache.java | 6 ++--- .../yang/data/util/codec/LazyCodecCache.java | 8 +++--- .../yang/data/util/codec/NoopCodecCache.java | 6 ++--- .../util/codec/PrecomputedCodecCache.java | 11 ++++---- .../data/util/codec/SharedCodecCache.java | 9 ++++--- .../yang/model/api/LeafListSchemaNode.java | 2 +- .../yang/model/api/LeafSchemaNode.java | 2 +- .../yangtools/yang/model/api/TypeAware.java | 22 ++++++++++++++++ ...hemaNode.java => TypedDataSchemaNode.java} | 5 ++-- .../yang/model/util/SchemaContextUtil.java | 6 ++--- 20 files changed, 88 insertions(+), 79 deletions(-) create mode 100644 yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypeAware.java rename yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/{TypedSchemaNode.java => TypedDataSchemaNode.java} (84%) diff --git a/yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/AnnotationSchemaNode.java b/yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/AnnotationSchemaNode.java index c0b2c57d7d..d7e69da3ba 100644 --- a/yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/AnnotationSchemaNode.java +++ b/yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/AnnotationSchemaNode.java @@ -15,7 +15,7 @@ import java.util.Optional; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypeAware; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; /** @@ -23,7 +23,7 @@ import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; * RFC7952, being attached to a SchemaNode. */ @Beta -public interface AnnotationSchemaNode extends UnknownSchemaNode, TypedSchemaNode { +public interface AnnotationSchemaNode extends UnknownSchemaNode, TypeAware { /** * Find specified annotation if it is supported by the specified SchemaContext. * diff --git a/yang/rfc7952-parser-support/src/main/java/org/opendaylight/yangtools/rfc7952/parser/Annotation.java b/yang/rfc7952-parser-support/src/main/java/org/opendaylight/yangtools/rfc7952/parser/Annotation.java index 75f317d02c..24c79a53c3 100644 --- a/yang/rfc7952-parser-support/src/main/java/org/opendaylight/yangtools/rfc7952/parser/Annotation.java +++ b/yang/rfc7952-parser-support/src/main/java/org/opendaylight/yangtools/rfc7952/parser/Annotation.java @@ -11,7 +11,6 @@ import org.opendaylight.yangtools.rfc7952.model.api.AnnotationEffectiveStatement import org.opendaylight.yangtools.rfc7952.model.api.AnnotationStatement; import org.opendaylight.yangtools.rfc7952.model.api.MetadataStatements; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; @@ -81,21 +80,6 @@ final class Annotation extends AbstractStatementSupport getType() { return type; } - - @Override - public boolean isConfiguration() { - return false; - } - - @Override - public ConstraintDefinition getConstraints() { - return null; - } - - @Override - public boolean isAugmenting() { - return false; - } } private static final Annotation INSTANCE = new Annotation(MetadataStatements.ANNOTATION); diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java index ed9011cfc7..0a5e082276 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java @@ -31,7 +31,7 @@ import org.opendaylight.yangtools.yang.data.util.codec.SharedCodecCache; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition; @@ -83,8 +83,8 @@ public final class JSONCodecFactory extends AbstractCodecFactory> { private static int requestCodecsForChildren(final JSONCodecFactory lazy, final DataNodeContainer parent) { int ret = 0; for (DataSchemaNode child : parent.getChildNodes()) { - if (child instanceof TypedSchemaNode) { - lazy.codecFor((TypedSchemaNode) child); + if (child instanceof TypedDataSchemaNode) { + lazy.codecFor((TypedDataSchemaNode) child); ++ret; } else if (child instanceof DataNodeContainer) { ret += requestCodecsForChildren(lazy, (DataNodeContainer) child); diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java index c9251e59c1..914dac17ce 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java @@ -52,7 +52,7 @@ import org.opendaylight.yangtools.yang.model.api.Module; 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.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -284,8 +284,8 @@ public final class JsonParserStream implements Closeable, Flushable { } private Object translateValueByType(final String value, final DataSchemaNode node) { - checkArgument(node instanceof TypedSchemaNode); - return codecs.codecFor((TypedSchemaNode) node).parseValue(null, value); + checkArgument(node instanceof TypedDataSchemaNode); + return codecs.codecFor((TypedDataSchemaNode) node).parseValue(null, value); } private void removeNamespace() { diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamWriterUtils.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamWriterUtils.java index 3c76d18775..73d03108df 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamWriterUtils.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamWriterUtils.java @@ -22,7 +22,7 @@ import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; @@ -68,11 +68,11 @@ abstract class XMLStreamWriterUtils { return; } - checkArgument(schemaNode instanceof TypedSchemaNode, + checkArgument(schemaNode instanceof TypedDataSchemaNode, "Unable to write value for node %s, only nodes of type: leaf and leaf-list can be written at this point", schemaNode.getQName()); - TypeDefinition type = ((TypedSchemaNode) schemaNode).getType(); + TypeDefinition type = ((TypedDataSchemaNode) schemaNode).getType(); if (type instanceof LeafrefTypeDefinition) { type = getBaseTypeForLeafRef(schemaNode, (LeafrefTypeDefinition) type); } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java index 42ce2eaceb..f2189b3f63 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java @@ -60,7 +60,7 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; 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.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode; import org.w3c.dom.Document; import org.xml.sax.InputSource; @@ -441,8 +441,8 @@ public final class XmlParserStream implements Closeable, Flushable { return new DOMSource(doc.getDocumentElement()); } - checkArgument(node instanceof TypedSchemaNode); - return codecs.codecFor((TypedSchemaNode) node).parseValue(namespaceCtx, value); + checkArgument(node instanceof TypedDataSchemaNode); + return codecs.codecFor((TypedDataSchemaNode) node).parseValue(namespaceCtx, value); } private static AbstractNodeDataWithSchema newEntryNode(final AbstractNodeDataWithSchema parent) { diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefContextTreeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefContextTreeBuilder.java index ddda315c07..66aa42b2a8 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefContextTreeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefContextTreeBuilder.java @@ -25,7 +25,7 @@ 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.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; class LeafRefContextTreeBuilder { @@ -115,8 +115,8 @@ class LeafRefContextTreeBuilder { } } - } else if (node instanceof TypedSchemaNode) { - final TypeDefinition type = ((TypedSchemaNode) node).getType(); + } else if (node instanceof TypedDataSchemaNode) { + final TypeDefinition type = ((TypedDataSchemaNode) node).getType(); // FIXME: fix case when type is e.g. typedef -> typedef -> leafref if (type instanceof LeafrefTypeDefinition) { diff --git a/yang/yang-data-jaxen/src/main/java/org/opendaylight/yangtools/yang/data/jaxen/LeafrefXPathStringParsingPathArgumentBuilder.java b/yang/yang-data-jaxen/src/main/java/org/opendaylight/yangtools/yang/data/jaxen/LeafrefXPathStringParsingPathArgumentBuilder.java index e3c6c62f9e..e8a4fa68a9 100644 --- a/yang/yang-data-jaxen/src/main/java/org/opendaylight/yangtools/yang/data/jaxen/LeafrefXPathStringParsingPathArgumentBuilder.java +++ b/yang/yang-data-jaxen/src/main/java/org/opendaylight/yangtools/yang/data/jaxen/LeafrefXPathStringParsingPathArgumentBuilder.java @@ -30,7 +30,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.ModuleImport; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; @Beta final class LeafrefXPathStringParsingPathArgumentBuilder implements Builder> { @@ -72,14 +72,14 @@ final class LeafrefXPathStringParsingPathArgumentBuilder implements Builder product = new ArrayList<>(); private int offset = 0; LeafrefXPathStringParsingPathArgumentBuilder(final String xpathString, final SchemaContext schemaContext, - final TypedSchemaNode schemaNode, final NormalizedNodeContext currentNodeCtx) { + final TypedDataSchemaNode schemaNode, final NormalizedNodeContext currentNodeCtx) { this.xpathString = xpathString; this.schemaContext = schemaContext; this.schemaNode = schemaNode; diff --git a/yang/yang-data-jaxen/src/main/java/org/opendaylight/yangtools/yang/data/jaxen/YangFunctionContext.java b/yang/yang-data-jaxen/src/main/java/org/opendaylight/yangtools/yang/data/jaxen/YangFunctionContext.java index c1378b8468..f9757db883 100644 --- a/yang/yang-data-jaxen/src/main/java/org/opendaylight/yangtools/yang/data/jaxen/YangFunctionContext.java +++ b/yang/yang-data-jaxen/src/main/java/org/opendaylight/yangtools/yang/data/jaxen/YangFunctionContext.java @@ -42,7 +42,7 @@ import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; @@ -103,7 +103,7 @@ final class YangFunctionContext implements FunctionContext { final NormalizedNodeContext currentNodeContext = (NormalizedNodeContext) context; final SchemaContext schemaContext = getSchemaContext(currentNodeContext); - final TypedSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, + final TypedDataSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, currentNodeContext); final Object nodeValue = currentNodeContext.getNode().getValue(); @@ -141,7 +141,7 @@ final class YangFunctionContext implements FunctionContext { private static NormalizedNode getNodeReferencedByLeafref(final RevisionAwareXPath xpath, final NormalizedNodeContext currentNodeContext, final SchemaContext schemaContext, - final TypedSchemaNode correspondingSchemaNode, final Object nodeValue) { + final TypedDataSchemaNode correspondingSchemaNode, final Object nodeValue) { final NormalizedNode referencedNode = xpath.isAbsolute() ? getNodeReferencedByAbsoluteLeafref(xpath, currentNodeContext, schemaContext, correspondingSchemaNode) : getNodeReferencedByRelativeLeafref(xpath, currentNodeContext, schemaContext, correspondingSchemaNode); @@ -159,7 +159,7 @@ final class YangFunctionContext implements FunctionContext { private static NormalizedNode getNodeReferencedByAbsoluteLeafref(final RevisionAwareXPath xpath, final NormalizedNodeContext currentNodeContext, final SchemaContext schemaContext, - final TypedSchemaNode correspondingSchemaNode) { + final TypedDataSchemaNode correspondingSchemaNode) { final LeafrefXPathStringParsingPathArgumentBuilder builder = new LeafrefXPathStringParsingPathArgumentBuilder( xpath.toString(), schemaContext, correspondingSchemaNode, currentNodeContext); final List pathArguments = builder.build(); @@ -178,7 +178,7 @@ final class YangFunctionContext implements FunctionContext { private static NormalizedNode getNodeReferencedByRelativeLeafref(final RevisionAwareXPath xpath, final NormalizedNodeContext currentNodeContext, final SchemaContext schemaContext, - final TypedSchemaNode correspondingSchemaNode) { + final TypedDataSchemaNode correspondingSchemaNode) { NormalizedNodeContext relativeNodeContext = currentNodeContext; final StringBuilder xPathStringBuilder = new StringBuilder(xpath.toString()); // strip the relative path of all ../ at the beginning @@ -228,7 +228,7 @@ final class YangFunctionContext implements FunctionContext { final NormalizedNodeContext currentNodeContext = (NormalizedNodeContext) context; final SchemaContext schemaContext = getSchemaContext(currentNodeContext); - final TypedSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, + final TypedDataSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, currentNodeContext); if (!(correspondingSchemaNode.getType() instanceof IdentityrefTypeDefinition)) { @@ -271,7 +271,7 @@ final class YangFunctionContext implements FunctionContext { final NormalizedNodeContext currentNodeContext = (NormalizedNodeContext) context; final SchemaContext schemaContext = getSchemaContext(currentNodeContext); - final TypedSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, + final TypedDataSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, currentNodeContext); if (!(correspondingSchemaNode.getType() instanceof IdentityrefTypeDefinition)) { @@ -314,7 +314,7 @@ final class YangFunctionContext implements FunctionContext { } private static IdentitySchemaNode getIdentitySchemaNodeFromString(final String identity, - final SchemaContext schemaContext, final TypedSchemaNode correspondingSchemaNode) { + final SchemaContext schemaContext, final TypedDataSchemaNode correspondingSchemaNode) { final List identityPrefixAndName = COLON_SPLITTER.splitToList(identity); final Module module = schemaContext.findModule(correspondingSchemaNode.getQName().getModule()).get(); if (identityPrefixAndName.size() == 2) { @@ -367,7 +367,7 @@ final class YangFunctionContext implements FunctionContext { final NormalizedNodeContext currentNodeContext = (NormalizedNodeContext) context; final SchemaContext schemaContext = getSchemaContext(currentNodeContext); - final TypedSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, + final TypedDataSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, currentNodeContext); final TypeDefinition nodeType = correspondingSchemaNode.getType(); @@ -414,7 +414,7 @@ final class YangFunctionContext implements FunctionContext { final NormalizedNodeContext currentNodeContext = (NormalizedNodeContext) context; final SchemaContext schemaContext = getSchemaContext(currentNodeContext); - final TypedSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, + final TypedDataSchemaNode correspondingSchemaNode = getCorrespondingTypedSchemaNode(schemaContext, currentNodeContext); final TypeDefinition nodeType = correspondingSchemaNode.getType(); @@ -450,7 +450,7 @@ final class YangFunctionContext implements FunctionContext { return ((NormalizedNodeContextSupport) contextSupport).getSchemaContext(); } - private static TypedSchemaNode getCorrespondingTypedSchemaNode(final SchemaContext schemaContext, + private static TypedDataSchemaNode getCorrespondingTypedSchemaNode(final SchemaContext schemaContext, final NormalizedNodeContext currentNodeContext) { Iterator ancestorOrSelfAxisIterator; try { @@ -473,9 +473,9 @@ final class YangFunctionContext implements FunctionContext { Preconditions.checkNotNull(schemaNode, "Node %s does not have a corresponding SchemaNode in the SchemaContext.", currentNodeContext.getNode()); - Preconditions.checkState(schemaNode instanceof TypedSchemaNode, "Node %s must be a leaf or a leaf-list.", + Preconditions.checkState(schemaNode instanceof TypedDataSchemaNode, "Node %s must be a leaf or a leaf-list.", currentNodeContext.getNode()); - return (TypedSchemaNode) schemaNode; + return (TypedDataSchemaNode) schemaNode; } // Singleton instance of reuse diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/AbstractCodecFactory.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/AbstractCodecFactory.java index b7f416b179..6699581dcc 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/AbstractCodecFactory.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/AbstractCodecFactory.java @@ -16,7 +16,7 @@ import javax.annotation.concurrent.ThreadSafe; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition; @@ -66,7 +66,7 @@ public abstract class AbstractCodecFactory> { return schemaContext; } - public final T codecFor(final TypedSchemaNode schema) { + public final T codecFor(final TypedDataSchemaNode schema) { /* * There are many trade-offs to be made here. We need the common case being as fast as possible while reusing * codecs as much as possible. @@ -209,7 +209,7 @@ public abstract class AbstractCodecFactory> { return true; } - private T createComplexCodecFor(final TypedSchemaNode schema, final TypeDefinition type) { + private T createComplexCodecFor(final TypedDataSchemaNode schema, final TypeDefinition type) { if (type instanceof UnionTypeDefinition) { return createComplexUnion(schema, (UnionTypeDefinition) type); } else if (type instanceof LeafrefTypeDefinition) { @@ -243,7 +243,7 @@ public abstract class AbstractCodecFactory> { return unionCodec(union, codecs); } - private T createComplexUnion(final TypedSchemaNode schema, final UnionTypeDefinition union) { + private T createComplexUnion(final TypedDataSchemaNode schema, final UnionTypeDefinition union) { final List> types = union.getTypes(); final List codecs = new ArrayList<>(types.size()); diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/CodecCache.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/CodecCache.java index a80fc5e4d4..702d11b86a 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/CodecCache.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/CodecCache.java @@ -11,7 +11,7 @@ import com.google.common.annotations.Beta; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; /** * Abstract cache for codecs. @@ -28,7 +28,7 @@ public abstract class CodecCache { * @param schema Schema node * @return Cached codec, or null if no codec is cached. */ - @Nullable abstract T lookupComplex(TypedSchemaNode schema); + @Nullable abstract T lookupComplex(TypedDataSchemaNode schema); /** * Lookup a simple codec for a type definition. @@ -45,7 +45,7 @@ public abstract class CodecCache { * @param codec Codec to cache * @return Codec instance, either already-cached, or the codec presented as argument. */ - @Nonnull abstract T getComplex(TypedSchemaNode schema, T codec); + @Nonnull abstract T getComplex(TypedDataSchemaNode schema, T codec); /** * Lookup-or-store a simple codec for a particular schema node. diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/LazyCodecCache.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/LazyCodecCache.java index b996d774e8..ae06eeef7e 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/LazyCodecCache.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/LazyCodecCache.java @@ -12,7 +12,7 @@ import java.util.IdentityHashMap; import java.util.Map; import javax.annotation.concurrent.NotThreadSafe; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; /** * Lazily-populated CodecCache. This is a non-thread-safe factory, which performs caching of codecs. It is most @@ -23,16 +23,16 @@ import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; @Beta @NotThreadSafe public final class LazyCodecCache extends CodecCache { - private final Map complexCodecs = new IdentityHashMap<>(); + private final Map complexCodecs = new IdentityHashMap<>(); private final Map, T> simpleCodecs = new IdentityHashMap<>(); @Override - T getComplex(final TypedSchemaNode schema, final T codec) { + T getComplex(final TypedDataSchemaNode schema, final T codec) { return complexCodecs.computeIfAbsent(schema, any -> codec); } @Override - T lookupComplex(final TypedSchemaNode schema) { + T lookupComplex(final TypedDataSchemaNode schema) { return complexCodecs.get(schema); } diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/NoopCodecCache.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/NoopCodecCache.java index 4a005af8a4..ef645cb0b5 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/NoopCodecCache.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/NoopCodecCache.java @@ -10,7 +10,7 @@ package org.opendaylight.yangtools.yang.data.util.codec; import com.google.common.annotations.Beta; import javax.annotation.concurrent.ThreadSafe; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; /** * A no-operation codec cache. @@ -34,7 +34,7 @@ public final class NoopCodecCache extends CodecCache { } @Override - T lookupComplex(final TypedSchemaNode schema) { + T lookupComplex(final TypedDataSchemaNode schema) { return null; } @@ -49,7 +49,7 @@ public final class NoopCodecCache extends CodecCache { } @Override - T getComplex(final TypedSchemaNode schema, final T codec) { + T getComplex(final TypedDataSchemaNode schema, final T codec) { return codec; } } diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/PrecomputedCodecCache.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/PrecomputedCodecCache.java index ac16179c3f..99d4cab50a 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/PrecomputedCodecCache.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/PrecomputedCodecCache.java @@ -14,7 +14,7 @@ import com.google.common.annotations.Beta; import java.util.Map; import javax.annotation.concurrent.ThreadSafe; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; /** * Pre-computed CodecCache. All possible codecs are created upfront at instantiation time, after which they are @@ -30,15 +30,16 @@ import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; @ThreadSafe public final class PrecomputedCodecCache extends CodecCache { private final Map, T> simpleCodecs; - private final Map complexCodecs; + private final Map complexCodecs; - PrecomputedCodecCache(final Map, T> simpleCodecs, final Map complexCodecs) { + PrecomputedCodecCache(final Map, T> simpleCodecs, + final Map complexCodecs) { this.simpleCodecs = requireNonNull(simpleCodecs); this.complexCodecs = requireNonNull(complexCodecs); } @Override - T lookupComplex(final TypedSchemaNode schema) { + T lookupComplex(final TypedDataSchemaNode schema) { final T ret = complexCodecs.get(schema); checkArgument(ret != null, "No codec available for schema %s", schema); return ret; @@ -50,7 +51,7 @@ public final class PrecomputedCodecCache extends CodecCache { } @Override - T getComplex(final TypedSchemaNode schema, final T codec) { + T getComplex(final TypedDataSchemaNode schema, final T codec) { throw new IllegalStateException("Uncached codec for " + schema); } diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/SharedCodecCache.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/SharedCodecCache.java index 026ed9fa2a..264e7c8fed 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/SharedCodecCache.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/SharedCodecCache.java @@ -14,7 +14,7 @@ import com.google.common.cache.CacheBuilder; import java.util.concurrent.ExecutionException; import javax.annotation.concurrent.ThreadSafe; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; /** * A thread-safe lazily-populated codec cache. Instances are cached in an internal weak/soft cache. @@ -27,10 +27,11 @@ public final class SharedCodecCache extends CodecCache { // Weak keys to force identity lookup // Soft values to keep unreferenced codecs around for a bit, but eventually we want them to go away private final Cache, T> simpleCodecs = CacheBuilder.newBuilder().weakKeys().softValues().build(); - private final Cache complexCodecs = CacheBuilder.newBuilder().weakKeys().softValues().build(); + private final Cache complexCodecs = CacheBuilder.newBuilder().weakKeys().softValues() + .build(); @Override - public T lookupComplex(final TypedSchemaNode schema) { + public T lookupComplex(final TypedDataSchemaNode schema) { return complexCodecs.getIfPresent(schema); } @@ -40,7 +41,7 @@ public final class SharedCodecCache extends CodecCache { } @Override - T getComplex(final TypedSchemaNode schema, final T codec) { + T getComplex(final TypedDataSchemaNode schema, final T codec) { try { return complexCodecs.get(schema, () -> codec); } catch (ExecutionException e) { diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafListSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafListSchemaNode.java index 1af2d5db20..97dfe43933 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafListSchemaNode.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafListSchemaNode.java @@ -13,7 +13,7 @@ import javax.annotation.Nonnull; /** * Interface describing YANG 'leaf-list' statement. */ -public interface LeafListSchemaNode extends TypedSchemaNode, MustConstraintAware { +public interface LeafListSchemaNode extends TypedDataSchemaNode, MustConstraintAware { /** * YANG 'ordered-by' statement. It defines whether the order of entries * within this leaf-list are determined by the user or the system. If not diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafSchemaNode.java index 673da45012..1c6d6d3587 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafSchemaNode.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafSchemaNode.java @@ -17,6 +17,6 @@ package org.opendaylight.yangtools.yang.model.api; * Since we are presenting the effective model of the world, the information dictated by 'default' and 'units' * substatements is captured in the type returned via {@link #getType()}. */ -public interface LeafSchemaNode extends TypedSchemaNode, MandatoryAware, MustConstraintAware { +public interface LeafSchemaNode extends TypedDataSchemaNode, MandatoryAware, MustConstraintAware { } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypeAware.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypeAware.java new file mode 100644 index 0000000000..efd94bd215 --- /dev/null +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypeAware.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.model.api; + +/** + * Marker interface for SchemaNodes which store simple data, for which we have type information. + * + * @author Robert Varga + */ +public interface TypeAware { + /** + * Returns the type definition of stored data. + * + * @return type definition. + */ + TypeDefinition> getType(); +} diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypedSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypedDataSchemaNode.java similarity index 84% rename from yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypedSchemaNode.java rename to yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypedDataSchemaNode.java index 2b344464f0..f6ff17dc4a 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypedSchemaNode.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypedDataSchemaNode.java @@ -13,13 +13,14 @@ package org.opendaylight.yangtools.yang.model.api; * * @author Robert Varga */ -public interface TypedSchemaNode extends DataSchemaNode { +public interface TypedDataSchemaNode extends DataSchemaNode, TypeAware { /** * Returns type of the instance which implements DataSchemaNode. * - * @return type definition of leaf-list schema node which represents the + * @return type definition of leaf or leaf-list schema node which represents the * value of the argument of the YANG type substatement * of the leaf or leaf-list statement */ + @Override TypeDefinition> getType(); } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java index 628a1c8be4..3c367be642 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java @@ -40,7 +40,7 @@ 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.TypedSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier; import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; @@ -739,9 +739,9 @@ public final class SchemaContextUtil { private static Module findParentModuleOfReferencingType(final SchemaContext schemaContext, final SchemaNode schemaNode) { Preconditions.checkArgument(schemaContext != null, "Schema Context reference cannot be NULL!"); - Preconditions.checkArgument(schemaNode instanceof TypedSchemaNode, "Unsupported node %s", schemaNode); + Preconditions.checkArgument(schemaNode instanceof TypedDataSchemaNode, "Unsupported node %s", schemaNode); - TypeDefinition nodeType = ((TypedSchemaNode) schemaNode).getType(); + TypeDefinition nodeType = ((TypedDataSchemaNode) schemaNode).getType(); if (nodeType.getBaseType() != null) { while (nodeType.getBaseType() != null) { nodeType = nodeType.getBaseType(); -- 2.36.6