2 * Copyright (c) 2014 Cisco Systems, Inc. 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.yangtools.binding.data.codec.gen.impl;
10 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
11 import org.opendaylight.yangtools.binding.data.codec.util.AugmentableDispatchSerializer;
12 import org.opendaylight.yangtools.binding.data.codec.util.ChoiceDispatchSerializer;
13 import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
14 import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
15 import org.opendaylight.yangtools.yang.binding.DataObject;
16 import org.opendaylight.yangtools.yang.binding.DataObjectSerializerImplementation;
17 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
18 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
19 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
21 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
25 * Concrete implementation of {@link AbstractStreamWriterGenerator}
26 * which in runtime generates classes implementing {@link DataObjectSerializerImplementation}
27 * interface and are used to serialize Binding {@link DataObject}.
29 * Actual implementation of codecs is done via static methods, which allows
30 * for static wiring of codecs. Choice codec and Augmentable codecs
31 * are static properties of parent codec and stateless implementations
32 * are used ( {@link ChoiceDispatchSerializer}, {@link AugmentableDispatchSerializer},
33 * which uses registry to dispatch to concrete item codec.
36 public class StreamWriterGenerator extends AbstractStreamWriterGenerator {
39 private static final String UNKNOWN_SIZE = BindingStreamEventWriter.class.getName() + ".UNKNOWN_SIZE";
41 private StreamWriterGenerator(final JavassistUtils utils, final Void ignore) {
46 * Deprecated, use {@link #create(JavassistUtils)} instead.
50 public StreamWriterGenerator(final JavassistUtils utils) {
55 * Create a new instance backed by a specific {@link JavassistUtils} instance.
57 * @param utils JavassistUtils instance to use
58 * @return A new generator
60 public static DataObjectSerializerGenerator create(final JavassistUtils utils) {
61 return new StreamWriterGenerator(utils, null);
64 private static CharSequence getChildSizeFromSchema(final DataNodeContainer node) {
65 return Integer.toString(node.getChildNodes().size());
70 protected DataObjectSerializerSource generateContainerSerializer(final GeneratedType type, final ContainerSchemaNode node) {
72 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
74 public CharSequence emitStartEvent() {
75 return startContainerNode(classReference(type), UNKNOWN_SIZE);
81 protected DataObjectSerializerSource generateNotificationSerializer(final GeneratedType type, final NotificationDefinition node) {
83 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
85 public CharSequence emitStartEvent() {
86 return startContainerNode(classReference(type), UNKNOWN_SIZE);
92 protected DataObjectSerializerSource generateCaseSerializer(final GeneratedType type, final ChoiceCaseNode node) {
93 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
95 public CharSequence emitStartEvent() {
96 return startCaseNode(classReference(type),UNKNOWN_SIZE);
102 protected DataObjectSerializerSource generateUnkeyedListEntrySerializer(final GeneratedType type, final ListSchemaNode node) {
103 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
106 public CharSequence emitStartEvent() {
107 return startUnkeyedListItem(UNKNOWN_SIZE);
113 protected DataObjectSerializerSource generateSerializer(final GeneratedType type, final AugmentationSchema schema) {
114 return new DataNodeContainerSerializerSource(this, type, schema) {
117 public CharSequence emitStartEvent() {
118 return startAugmentationNode(classReference(type));
124 protected DataObjectSerializerSource generateMapEntrySerializer(final GeneratedType type, final ListSchemaNode node) {
125 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
127 public CharSequence emitStartEvent() {
128 return startMapEntryNode(invoke(INPUT, "getKey"), UNKNOWN_SIZE);