Binding codec v2 - fix augmentation #6 45/64145/16
authorJie Han <han.jie@zte.com.cn>
Wed, 11 Oct 2017 06:41:10 +0000 (14:41 +0800)
committerRobert Varga <nite@hq.sk>
Wed, 21 Feb 2018 17:18:58 +0000 (17:18 +0000)
- Add AbstractStreamWriterGenerator to support multiple
  augmentation schemas with the same target path for
  one generated type.

Change-Id: Iac5ec67adb6f77da2e181c59c4e6cecb0239fb9d
Signed-off-by: Jie Han <han.jie@zte.com.cn>
binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/impl/StreamWriterGenerator.java
binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/generator/AbstractStreamWriterGenerator.java
binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractAugmentSerializerSource.java [new file with mode: 0644]
binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractDataNodeContainerSerializerSource.java

index 819b209649f65bbea0eafee826725f1ae8e6c5b9..b84a26e74d1e09d54ff939b864b1054bc187241d 100644 (file)
@@ -8,10 +8,11 @@
 package org.opendaylight.mdsal.binding.javav2.dom.codec.generator.impl;
 
 import com.google.common.annotations.Beta;
+import java.util.Collection;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.api.TreeNodeSerializerGenerator;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.generator.AbstractStreamWriterGenerator;
+import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.source.AbstractAugmentSerializerSource;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.source.AbstractAugmentableDataNodeContainerEmitterSource;
-import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.source.AbstractDataNodeContainerSerializerSource;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.source.AbstractTreeNodeSerializerSource;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.serializer.AugmentableDispatchSerializer;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.serializer.ChoiceDispatchSerializer;
@@ -109,9 +110,9 @@ public final class StreamWriterGenerator extends AbstractStreamWriterGenerator {
     }
 
     @Override
-    protected AbstractTreeNodeSerializerSource generateSerializer(final GeneratedType type,
-            final AugmentationSchemaNode schema) {
-        return new AbstractDataNodeContainerSerializerSource(this, type, schema) {
+    protected AbstractTreeNodeSerializerSource generateAugmentSerializer(final GeneratedType type,
+            final Collection<AugmentationSchemaNode> augmentationSchemas) {
+        return new AbstractAugmentSerializerSource(this, type, augmentationSchemas) {
 
             @Override
             public CharSequence emitStartEvent() {
index 2515201a103999fe475e1e228d21d5c8daeeeaa4..7e6a5b7fdb8a9465346cb043dba1a3200be04410 100644 (file)
@@ -15,6 +15,7 @@ import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
 import java.util.Map.Entry;
 import javassist.CannotCompileException;
 import javassist.CtClass;
@@ -30,6 +31,8 @@ import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.source.Abst
 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.serializer.AugmentableDispatchSerializer;
 import org.opendaylight.mdsal.binding.javav2.generator.util.Types;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
+import org.opendaylight.mdsal.binding.javav2.model.api.Type;
+import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.javav2.runtime.context.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.javav2.runtime.javassist.JavassistUtils;
 import org.opendaylight.mdsal.binding.javav2.runtime.reflection.BindingReflections;
@@ -38,6 +41,7 @@ import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingStreamEventWriter;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.TreeNodeSerializerImplementation;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.TreeNodeSerializerRegistry;
+import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentation;
 import org.opendaylight.yangtools.util.ClassLoaderUtils;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
@@ -168,6 +172,12 @@ public abstract class AbstractStreamWriterGenerator extends AbstractGenerator im
     private AbstractTreeNodeSerializerSource generateEmitterSource(final Class<?> type, final String serializerName) {
         Types.typeForClass(type);
         javassist.appendClassLoaderIfMissing(type.getClassLoader());
+
+        if (Augmentation.class.isAssignableFrom(type)) {
+            final Entry<Type, Collection<AugmentationSchemaNode>> entry = context.getAugmentationDefinition(type);
+            return generateAugmentSerializer(((GeneratedTypeBuilder) entry.getKey()).toInstance(), entry.getValue());
+        }
+
         final Entry<GeneratedType, Object> typeWithSchema = context.getTypeWithSchema(type);
         final GeneratedType generatedType = typeWithSchema.getKey();
         final Object schema = typeWithSchema.getValue();
@@ -182,8 +192,6 @@ public abstract class AbstractStreamWriterGenerator extends AbstractGenerator im
             } else {
                 source = generateMapEntrySerializer(generatedType, casted);
             }
-        } else if (schema instanceof AugmentationSchemaNode) {
-            source = generateSerializer(generatedType, (AugmentationSchemaNode) schema);
         } else if (schema instanceof CaseSchemaNode) {
             source = generateCaseSerializer(generatedType, (CaseSchemaNode) schema);
         } else if (schema instanceof NotificationDefinition) {
@@ -310,11 +318,11 @@ public abstract class AbstractStreamWriterGenerator extends AbstractGenerator im
      * binding objects.
      *
      * @param type - binding type of augmentation
-     * @param schema - schema of augmentation
+     * @param schemas - schemas of augmentation
      * @return source for augmentation node writer
      */
-    protected abstract AbstractTreeNodeSerializerSource generateSerializer(GeneratedType type,
-            AugmentationSchemaNode schema);
+    protected abstract AbstractTreeNodeSerializerSource generateAugmentSerializer(GeneratedType type,
+        Collection<AugmentationSchemaNode> schemas);
 
     /**
      * Generates serializer source for notification node, which will read
diff --git a/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractAugmentSerializerSource.java b/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractAugmentSerializerSource.java
new file mode 100644 (file)
index 0000000..3db728c
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2017 Cisco Systems, Inc. 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.mdsal.binding.javav2.dom.codec.generator.spi.source;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Preconditions;
+import java.util.ArrayList;
+import java.util.Collection;
+import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.generator.AbstractGenerator;
+import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Beta
+public abstract class AbstractAugmentSerializerSource extends AbstractDataNodeContainerSerializerSource {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractAugmentSerializerSource.class);
+    private final Collection<AugmentationSchemaNode> augmentationSchemas;
+
+    public AbstractAugmentSerializerSource(final AbstractGenerator generator, final GeneratedType type,
+                                           final Collection<AugmentationSchemaNode> augmentationSchemas) {
+        // Note: passing first augmentation schema node just to avoid exceptions from super class.
+        super(generator, type, augmentationSchemas.stream().findFirst().get());
+        this.augmentationSchemas = Preconditions.checkNotNull(augmentationSchemas);
+    }
+
+    /**
+     * Override {@link AbstractDataNodeContainerSerializerSource#getChildNodes()} to get all children nodes
+     * of same target augmentation schema nodes.
+     */
+    @Override
+    protected Collection<DataSchemaNode> getChildNodes() {
+        Collection<DataSchemaNode> childNodes = new ArrayList<>();
+        for (AugmentationSchemaNode schema : this.augmentationSchemas) {
+            childNodes.addAll(schema.getChildNodes());
+        }
+        return childNodes;
+    }
+
+}
index fe1b9f142316746022de1761e8d9d8c23edf8f98..d5515be35a3dc976471abc05f81183940753096f 100755 (executable)
@@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.source;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.impl.StreamWriterGenerator;
@@ -49,6 +50,7 @@ public abstract class AbstractDataNodeContainerSerializerSource extends Abstract
     protected static final String INPUT = "_input";
     private static final String CHOICE_PREFIX = "CHOICE_";
 
+    //Note: the field takes no effects by augmentation.
     private final DataNodeContainer schemaNode;
     private final GeneratedType dtoType;
 
@@ -143,9 +145,19 @@ public abstract class AbstractDataNodeContainerSerializerSource extends Abstract
         return true;
     }
 
+    /**
+     * Note: the method would be overrided by {@link AbstractAugmentSerializerSource#getChildNodes()},
+     * since all augmentation schema nodes of same target would be grouped into sort of one node,
+     * so call {@link AbstractAugmentSerializerSource#getChildNodes()} to get all these children
+     * nodes of same target augmentation schemas.
+     */
+    protected Collection<DataSchemaNode> getChildNodes() {
+        return schemaNode.getChildNodes();
+    }
+
     private void emitBody(final StringBuilder builder) {
         final Map<String, Type> getterToType = collectAllProperties(dtoType, new HashMap<String, Type>());
-        for (final DataSchemaNode schemaChild : schemaNode.getChildNodes()) {
+        for (final DataSchemaNode schemaChild : getChildNodes()) {
             /**
              * As before, it only emitted data nodes which were not added by uses or augment, now
              * according to binding v2 specification, augment of the same module is same as inlining,