Merge "Bug 2924: DataCodecTree expose (de)serialization methods for path arguments."
[yangtools.git] / code-generator / binding-data-codec / src / main / java / org / opendaylight / yangtools / binding / data / codec / impl / LeafNodeCodecContext.java
index 424bd264f51280cd628c1f62dd25837cd73f160e..e8d115c16da8a71fa8fe51bde68d4fa16edbbcb8 100644 (file)
@@ -7,18 +7,37 @@
  */
 package org.opendaylight.yangtools.binding.data.codec.impl;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableCollection;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeNode;
+import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeCachingCodec;
 import org.opendaylight.yangtools.concepts.Codec;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+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.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 
-class LeafNodeCodecContext extends NodeCodecContext {
+final class LeafNodeCodecContext<D extends DataObject> extends NodeCodecContext<D> implements NodeContextSupplier {
 
     private final YangInstanceIdentifier.PathArgument yangIdentifier;
     private final Codec<Object, Object> valueCodec;
+    private final Method getter;
 
-    LeafNodeCodecContext(final DataSchemaNode node, final Codec<Object, Object> codec) {
-        this.yangIdentifier = new YangInstanceIdentifier.NodeIdentifier(node.getQName());
+    public LeafNodeCodecContext(final DataSchemaNode schema, final Codec<Object, Object> codec, final Method getter) {
+        this.yangIdentifier = new YangInstanceIdentifier.NodeIdentifier(schema.getQName());
         this.valueCodec = codec;
+        this.getter = getter;
     }
 
     @Override
@@ -30,4 +49,89 @@ class LeafNodeCodecContext extends NodeCodecContext {
         return valueCodec;
     }
 
+    @Override
+    public D deserialize(final NormalizedNode<?, ?> normalizedNode) {
+        throw new UnsupportedOperationException("Leaf can not be deserialized to DataObject");
+    }
+
+    @Override
+    public NodeCodecContext<?> get() {
+        return this;
+    }
+
+    final Method getGetter() {
+        return getter;
+    }
+
+    @Override
+    public BindingCodecTreeNode<?> bindingPathArgumentChild(PathArgument arg,
+            List<YangInstanceIdentifier.PathArgument> builder) {
+        return null;
+    }
+
+    @Override
+    public BindingNormalizedNodeCachingCodec<D> createCachingCodec(
+            ImmutableCollection<Class<? extends DataObject>> cacheSpecifier) {
+        return null;
+    }
+
+    @Override
+    public Class<D> getBindingClass() {
+        return null;
+    }
+
+    @Override
+    public NormalizedNode<?, ?> serialize(D data) {
+        throw new UnsupportedOperationException("Separete serialization of leaf node is not supported.");
+    }
+
+    @Override
+    public void writeAsNormalizedNode(D data, NormalizedNodeStreamWriter writer) {
+        throw new UnsupportedOperationException("Separete serialization of leaf node is not supported.");
+    }
+
+    @Override
+    public <E extends DataObject> BindingCodecTreeNode<E> streamChild(Class<E> childClass) {
+        return null;
+    }
+
+    @Override
+    public <E extends DataObject> Optional<? extends BindingCodecTreeNode<E>> possibleStreamChild(
+            Class<E> childClass) {
+        return null;
+    }
+
+    @Override
+    public BindingCodecTreeNode<?> yangPathArgumentChild(
+            org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument child) {
+        return null;
+    }
+
+    @Override
+    protected Object deserializeObject(NormalizedNode<?, ?> normalizedNode) {
+        if (normalizedNode instanceof LeafNode<?>) {
+            return valueCodec.deserialize(normalizedNode.getValue());
+        } else if(normalizedNode instanceof LeafSetNode<?>) {
+            @SuppressWarnings("unchecked")
+            Collection<LeafSetEntryNode<Object>> domValues = ((LeafSetNode<Object>) normalizedNode).getValue();
+            List<Object> result = new ArrayList<>(domValues.size());
+            for (LeafSetEntryNode<Object> valueNode : domValues) {
+                result.add(valueCodec.deserialize(valueNode.getValue()));
+            }
+            return result;
+        }
+        return null;
+    }
+
+    @Override
+    public InstanceIdentifier.PathArgument deserializePathArgument(YangInstanceIdentifier.PathArgument arg) {
+        Preconditions.checkArgument(getDomPathArgument().equals(arg));
+        return null;
+    }
+
+    @Override
+    public YangInstanceIdentifier.PathArgument serializePathArgument(InstanceIdentifier.PathArgument arg) {
+        return getDomPathArgument();
+    }
+
 }
\ No newline at end of file