From 9980edaa8bd5555e00f0e26d5b965ed4d6e53f76 Mon Sep 17 00:00:00 2001 From: Jie Han Date: Wed, 11 Oct 2017 14:41:10 +0800 Subject: [PATCH] Binding codec v2 - fix augmentation #6 - Add AbstractStreamWriterGenerator to support multiple augmentation schemas with the same target path for one generated type. Change-Id: Iac5ec67adb6f77da2e181c59c4e6cecb0239fb9d Signed-off-by: Jie Han --- .../generator/impl/StreamWriterGenerator.java | 9 ++-- .../AbstractStreamWriterGenerator.java | 18 +++++-- .../AbstractAugmentSerializerSource.java | 47 +++++++++++++++++++ ...ractDataNodeContainerSerializerSource.java | 14 +++++- 4 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractAugmentSerializerSource.java diff --git a/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/impl/StreamWriterGenerator.java b/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/impl/StreamWriterGenerator.java index 819b209649..b84a26e74d 100644 --- a/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/impl/StreamWriterGenerator.java +++ b/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/impl/StreamWriterGenerator.java @@ -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 augmentationSchemas) { + return new AbstractAugmentSerializerSource(this, type, augmentationSchemas) { @Override public CharSequence emitStartEvent() { diff --git a/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/generator/AbstractStreamWriterGenerator.java b/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/generator/AbstractStreamWriterGenerator.java index 2515201a10..7e6a5b7fdb 100644 --- a/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/generator/AbstractStreamWriterGenerator.java +++ b/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/generator/AbstractStreamWriterGenerator.java @@ -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> entry = context.getAugmentationDefinition(type); + return generateAugmentSerializer(((GeneratedTypeBuilder) entry.getKey()).toInstance(), entry.getValue()); + } + final Entry 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 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 index 0000000000..3db728c108 --- /dev/null +++ b/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractAugmentSerializerSource.java @@ -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 augmentationSchemas; + + public AbstractAugmentSerializerSource(final AbstractGenerator generator, final GeneratedType type, + final Collection 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 getChildNodes() { + Collection childNodes = new ArrayList<>(); + for (AugmentationSchemaNode schema : this.augmentationSchemas) { + childNodes.addAll(schema.getChildNodes()); + } + return childNodes; + } + +} diff --git a/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractDataNodeContainerSerializerSource.java b/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractDataNodeContainerSerializerSource.java index fe1b9f1423..d5515be35a 100755 --- a/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractDataNodeContainerSerializerSource.java +++ b/binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/generator/spi/source/AbstractDataNodeContainerSerializerSource.java @@ -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 getChildNodes() { + return schemaNode.getChildNodes(); + } + private void emitBody(final StringBuilder builder) { final Map getterToType = collectAllProperties(dtoType, new HashMap()); - 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, -- 2.36.6