2 * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.javav2.dom.codec.generator.impl;
10 import com.google.common.annotations.Beta;
11 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.api.TreeNodeSerializerGenerator;
12 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.generator.AbstractStreamWriterGenerator;
13 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.source.AbstractAugmentableDataNodeContainerEmitterSource;
14 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.source.AbstractDataNodeContainerSerializerSource;
15 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.spi.source.AbstractTreeNodeSerializerSource;
16 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.serializer.AugmentableDispatchSerializer;
17 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.serializer.ChoiceDispatchSerializer;
18 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
19 import org.opendaylight.mdsal.binding.javav2.runtime.javassist.JavassistUtils;
20 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
21 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingStreamEventWriter;
22 import org.opendaylight.mdsal.binding.javav2.spec.runtime.TreeNodeSerializerImplementation;
23 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
24 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
25 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
30 * Concrete implementation of {@link AbstractStreamWriterGenerator} which in
31 * runtime generates classes implementing
32 * {@link TreeNodeSerializerImplementation} interface and are used to serialize
33 * Binding {@link TreeNode}.
36 * Actual implementation of codecs is done via static methods, which allows for
37 * static wiring of codecs. Choice codec and Augmentable codecs are static
38 * properties of parent codec and stateless implementations are used (
39 * {@link ChoiceDispatchSerializer}, {@link AugmentableDispatchSerializer},
40 * which uses registry to dispatch to concrete item codec.
44 public class StreamWriterGenerator extends AbstractStreamWriterGenerator {
46 private static final String UNKNOWN_SIZE = BindingStreamEventWriter.class.getName() + ".UNKNOWN_SIZE";
48 private StreamWriterGenerator(final JavassistUtils utils, final Void ignore) {
53 * Create a new instance backed by a specific {@link JavassistUtils}
57 * JavassistUtils instance to use
58 * @return A new generator
60 public static TreeNodeSerializerGenerator create(final JavassistUtils utils) {
61 return new StreamWriterGenerator(utils, null);
65 protected AbstractTreeNodeSerializerSource generateContainerSerializer(final GeneratedType type,
66 final ContainerSchemaNode node) {
68 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
70 public CharSequence emitStartEvent() {
71 return startContainerNode(classReference(type), UNKNOWN_SIZE);
77 protected AbstractTreeNodeSerializerSource generateNotificationSerializer(final GeneratedType type,
78 final NotificationDefinition node) {
80 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
82 public CharSequence emitStartEvent() {
83 return startContainerNode(classReference(type), UNKNOWN_SIZE);
89 protected AbstractTreeNodeSerializerSource generateCaseSerializer(final GeneratedType type,
90 final ChoiceCaseNode node) {
91 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
93 public CharSequence emitStartEvent() {
94 return startCaseNode(classReference(type), UNKNOWN_SIZE);
100 protected AbstractTreeNodeSerializerSource generateUnkeyedListEntrySerializer(final GeneratedType type,
101 final ListSchemaNode node) {
102 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
105 public CharSequence emitStartEvent() {
106 return startUnkeyedListItem(UNKNOWN_SIZE);
112 protected AbstractTreeNodeSerializerSource generateSerializer(final GeneratedType type,
113 final AugmentationSchema schema) {
114 return new AbstractDataNodeContainerSerializerSource(this, type, schema) {
117 public CharSequence emitStartEvent() {
118 return startAugmentationNode(classReference(type));
124 protected AbstractTreeNodeSerializerSource generateMapEntrySerializer(final GeneratedType type,
125 final ListSchemaNode node) {
126 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
128 public CharSequence emitStartEvent() {
129 return startMapEntryNode(invoke(INPUT, "getKey"), UNKNOWN_SIZE);