X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fcodec%2Fimpl%2FValueNodeCodecContext.java;h=2a9c53326666ee607f0aae5d4c8c93e480302c99;hb=c3613aa89ab5619abc59ac6e0e6890a9041249c7;hp=d0c892835a91fa4d0bfebc5c1bcff2a691cb6bca;hpb=c8f9df5fcbd555dcdf5c41fb2b13698f8350518a;p=mdsal.git diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueNodeCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueNodeCodecContext.java index d0c892835a..2a9c533266 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueNodeCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueNodeCodecContext.java @@ -9,161 +9,67 @@ package org.opendaylight.mdsal.binding.dom.codec.impl; import static java.util.Objects.requireNonNull; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import org.opendaylight.yangtools.concepts.Codec; -import org.opendaylight.yangtools.yang.common.QName; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec; 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.ModuleImport; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; /** * Abstract base class for atomic nodes. These are nodes which are not decomposed in the Binding Specification, such * as LeafNodes and LeafSetNodes. */ -// FIXME: MDSAL-436: this class should be specialized for Leaf and LeafSet -final class ValueNodeCodecContext extends NodeCodecContext implements NodeContextSupplier { - private final NodeIdentifier yangIdentifier; - private final Codec valueCodec; - private final Method getter; - private final TypedDataSchemaNode schema; - private final Object defaultObject; - - ValueNodeCodecContext(final TypedDataSchemaNode schema, final Codec codec, - final Method getter, final SchemaContext schemaContext) { - this.yangIdentifier = NodeIdentifier.create(schema.getQName()); - this.valueCodec = requireNonNull(codec); - this.getter = getter; - this.schema = requireNonNull(schema); - - this.defaultObject = createDefaultObject(schema, valueCodec, schemaContext); - } - - private static Object createDefaultObject(final DataSchemaNode schema, final Codec codec, - final SchemaContext schemaContext) { - if (schema instanceof LeafSchemaNode) { - Optional defaultValue = ((LeafSchemaNode) schema).getType().getDefaultValue(); - TypeDefinition type = ((LeafSchemaNode) schema).getType(); - if (defaultValue.isPresent()) { - if (type instanceof IdentityrefTypeDefinition) { - return qnameDomValueFromString(codec, schema, (String) defaultValue.get(), schemaContext); - } - return domValueFromString(codec, type, defaultValue.get()); - } - - while (type.getBaseType() != null && !type.getDefaultValue().isPresent()) { - type = type.getBaseType(); - } - - defaultValue = type.getDefaultValue(); - if (defaultValue.isPresent()) { - if (type instanceof IdentityrefTypeDefinition) { - return qnameDomValueFromString(codec, schema, (String) defaultValue.get(), schemaContext); - } - return domValueFromString(codec, type, defaultValue); - } +abstract sealed class ValueNodeCodecContext extends CodecContext implements CodecContextSupplier + permits AbstractOpaqueCodecContext, ValueNodeCodecContext.WithCodec { + abstract static sealed class WithCodec extends ValueNodeCodecContext + permits LeafNodeCodecContext, LeafSetNodeCodecContext { + private final @NonNull ValueCodec valueCodec; + + WithCodec(final DataSchemaNode schema, final ValueCodec codec, final String getterName, + final Object defaultObject) { + super(schema, getterName, defaultObject); + valueCodec = requireNonNull(codec); } - return null; - } - - private static Object qnameDomValueFromString(final Codec codec, final DataSchemaNode schema, - final String defaultValue, final SchemaContext schemaContext) { - int prefixEndIndex = defaultValue.indexOf(':'); - QName qname; - if (prefixEndIndex != -1) { - String defaultValuePrefix = defaultValue.substring(0, prefixEndIndex); - - Module module = schemaContext.findModule(schema.getQName().getModule()).get(); - if (module.getPrefix().equals(defaultValuePrefix)) { - qname = QName.create(module.getQNameModule(), defaultValue.substring(prefixEndIndex + 1)); - return codec.deserialize(qname); - } - Set imports = module.getImports(); - for (ModuleImport moduleImport : imports) { - if (moduleImport.getPrefix().equals(defaultValuePrefix)) { - Module importedModule = schemaContext.findModule(moduleImport.getModuleName(), - moduleImport.getRevision()).get(); - qname = QName.create(importedModule.getQNameModule(), defaultValue.substring(prefixEndIndex + 1)); - return codec.deserialize(qname); - } - } - return null; + @Override + final ValueCodec getValueCodec() { + return valueCodec; } - - qname = QName.create(schema.getQName(), defaultValue); - return codec.deserialize(qname); } - private static Object domValueFromString(final Codec codec, final TypeDefinition type, - final Object defaultValue) { - TypeDefinitionAwareCodec typeDefAwareCodec = TypeDefinitionAwareCodec.from(type); - if (typeDefAwareCodec != null) { - Object castedDefaultValue = typeDefAwareCodec.deserialize((String) defaultValue); - return codec.deserialize(castedDefaultValue); - } - // FIXME: BUG-4647 Refactor / redesign this to throw hard error, once BUG-4638 is fixed and will provide proper - // getDefaultValue() implementation. - return null; + private final @NonNull NodeIdentifier yangIdentifier; + private final @NonNull String getterName; + private final @NonNull DataSchemaNode schema; + private final Object defaultObject; + + ValueNodeCodecContext(final DataSchemaNode schema, final String getterName, final Object defaultObject) { + yangIdentifier = NodeIdentifier.create(schema.getQName()); + this.getterName = requireNonNull(getterName); + this.schema = requireNonNull(schema); + this.defaultObject = defaultObject; } @Override - protected NodeIdentifier getDomPathArgument() { + protected final NodeIdentifier getDomPathArgument() { return yangIdentifier; } - protected Codec getValueCodec() { - return valueCodec; - } - @Override - public NodeCodecContext get() { + public final CodecContext get() { return this; } - Method getGetter() { - return getter; + final String getGetterName() { + return getterName; } - @Override - protected Object deserializeObject(final NormalizedNode normalizedNode) { - if (normalizedNode instanceof LeafNode) { - return valueCodec.deserialize(normalizedNode.getValue()); - } - if (normalizedNode instanceof LeafSetNode) { - @SuppressWarnings("unchecked") - final Collection> domValues = ((LeafSetNode) normalizedNode).getValue(); - final List result = new ArrayList<>(domValues.size()); - for (final LeafSetEntryNode valueNode : domValues) { - result.add(valueCodec.deserialize(valueNode.getValue())); - } - return result; - } - return null; - } + abstract ValueCodec getValueCodec(); @Override - public TypedDataSchemaNode getSchema() { + public final DataSchemaNode getSchema() { return schema; } @Override - Object defaultObject() { + final Object defaultObject() { return defaultObject; } }