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.IdentifiableItem;
21 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
22 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingStreamEventWriter;
23 import org.opendaylight.mdsal.binding.javav2.spec.runtime.TreeNodeSerializerImplementation;
24 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
31 * Concrete implementation of {@link AbstractStreamWriterGenerator} which in
32 * runtime generates classes implementing
33 * {@link TreeNodeSerializerImplementation} interface and are used to serialize
34 * Binding {@link TreeNode}.
37 * Actual implementation of codecs is done via static methods, which allows for
38 * static wiring of codecs. Choice codec and Augmentable codecs are static
39 * properties of parent codec and stateless implementations are used (
40 * {@link ChoiceDispatchSerializer}, {@link AugmentableDispatchSerializer},
41 * which uses registry to dispatch to concrete item codec.
44 public final 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 CaseSchemaNode 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 AugmentationSchemaNode 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 StringBuilder sb = new StringBuilder()
131 .append(IdentifiableItem.class.getName())
133 .append(invoke(INPUT, "treeIdentifier"));
134 return startMapEntryNode(sb.toString(), UNKNOWN_SIZE);