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.
43 public final class StreamWriterGenerator extends AbstractStreamWriterGenerator {
45 private static final String UNKNOWN_SIZE = BindingStreamEventWriter.class.getName() + ".UNKNOWN_SIZE";
47 private StreamWriterGenerator(final JavassistUtils utils, final Void ignore) {
52 * Create a new instance backed by a specific {@link JavassistUtils}
56 * JavassistUtils instance to use
57 * @return A new generator
59 public static TreeNodeSerializerGenerator create(final JavassistUtils utils) {
60 return new StreamWriterGenerator(utils, null);
64 protected AbstractTreeNodeSerializerSource generateContainerSerializer(final GeneratedType type,
65 final ContainerSchemaNode node) {
67 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
69 public CharSequence emitStartEvent() {
70 return startContainerNode(classReference(type), UNKNOWN_SIZE);
76 protected AbstractTreeNodeSerializerSource generateNotificationSerializer(final GeneratedType type,
77 final NotificationDefinition node) {
79 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
81 public CharSequence emitStartEvent() {
82 return startContainerNode(classReference(type), UNKNOWN_SIZE);
88 protected AbstractTreeNodeSerializerSource generateCaseSerializer(final GeneratedType type,
89 final ChoiceCaseNode node) {
90 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
92 public CharSequence emitStartEvent() {
93 return startCaseNode(classReference(type), UNKNOWN_SIZE);
99 protected AbstractTreeNodeSerializerSource generateUnkeyedListEntrySerializer(final GeneratedType type,
100 final ListSchemaNode node) {
101 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
104 public CharSequence emitStartEvent() {
105 return startUnkeyedListItem(UNKNOWN_SIZE);
111 protected AbstractTreeNodeSerializerSource generateSerializer(final GeneratedType type,
112 final AugmentationSchema schema) {
113 return new AbstractDataNodeContainerSerializerSource(this, type, schema) {
116 public CharSequence emitStartEvent() {
117 return startAugmentationNode(classReference(type));
123 protected AbstractTreeNodeSerializerSource generateMapEntrySerializer(final GeneratedType type,
124 final ListSchemaNode node) {
125 return new AbstractAugmentableDataNodeContainerEmitterSource(this, type, node) {
127 public CharSequence emitStartEvent() {
128 return startMapEntryNode(invoke(INPUT, "getKey"), UNKNOWN_SIZE);