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.mdsal.binding.dom.codec.gen.impl;
10 import org.opendaylight.mdsal.binding.dom.codec.util.AugmentableDispatchSerializer;
11 import org.opendaylight.mdsal.binding.dom.codec.util.ChoiceDispatchSerializer;
12 import org.opendaylight.mdsal.binding.generator.util.JavassistUtils;
13 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
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.
35 public final class StreamWriterGenerator extends AbstractStreamWriterGenerator {
36 private static final String UNKNOWN_SIZE = BindingStreamEventWriter.class.getName() + ".UNKNOWN_SIZE";
38 private StreamWriterGenerator(final JavassistUtils utils) {
43 * Create a new instance backed by a specific {@link JavassistUtils} instance.
45 * @param utils JavassistUtils instance to use
46 * @return A new generator
48 public static DataObjectSerializerGenerator create(final JavassistUtils utils) {
49 return new StreamWriterGenerator(utils);
52 private static CharSequence getChildSizeFromSchema(final DataNodeContainer node) {
53 return Integer.toString(node.getChildNodes().size());
57 protected DataObjectSerializerSource generateContainerSerializer(final GeneratedType type, final ContainerSchemaNode node) {
59 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
61 public CharSequence emitStartEvent() {
62 return startContainerNode(classReference(type), UNKNOWN_SIZE);
68 protected DataObjectSerializerSource generateNotificationSerializer(final GeneratedType type, final NotificationDefinition node) {
70 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
72 public CharSequence emitStartEvent() {
73 return startContainerNode(classReference(type), UNKNOWN_SIZE);
79 protected DataObjectSerializerSource generateCaseSerializer(final GeneratedType type, final ChoiceCaseNode node) {
80 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
82 public CharSequence emitStartEvent() {
83 return startCaseNode(classReference(type),UNKNOWN_SIZE);
89 protected DataObjectSerializerSource generateUnkeyedListEntrySerializer(final GeneratedType type, final ListSchemaNode node) {
90 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
93 public CharSequence emitStartEvent() {
94 return startUnkeyedListItem(UNKNOWN_SIZE);
100 protected DataObjectSerializerSource generateSerializer(final GeneratedType type, final AugmentationSchema schema) {
101 return new DataNodeContainerSerializerSource(this, type, schema) {
104 public CharSequence emitStartEvent() {
105 return startAugmentationNode(classReference(type));
111 protected DataObjectSerializerSource generateMapEntrySerializer(final GeneratedType type, final ListSchemaNode node) {
112 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
114 public CharSequence emitStartEvent() {
115 return startMapEntryNode(invoke(INPUT, "getKey"), UNKNOWN_SIZE);