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} which in runtime generates classes implementing
26 * {@link DataObjectSerializerImplementation} interface and are used to serialize Binding {@link DataObject}.
29 * Actual implementation of codecs is done via static methods, which allows for static wiring of codecs. Choice codec
30 * and Augmentable codecs are static properties of parent codec and stateless implementations are used
31 * ({@link ChoiceDispatchSerializer}, {@link AugmentableDispatchSerializer}), which uses registry to dispatch to
32 * concrete item codec.
34 public final class StreamWriterGenerator extends AbstractStreamWriterGenerator {
35 private static final String UNKNOWN_SIZE = BindingStreamEventWriter.class.getName() + ".UNKNOWN_SIZE";
37 private StreamWriterGenerator(final JavassistUtils utils) {
42 * Create a new instance backed by a specific {@link JavassistUtils} instance.
44 * @param utils JavassistUtils instance to use
45 * @return A new generator
47 public static DataObjectSerializerGenerator create(final JavassistUtils utils) {
48 return new StreamWriterGenerator(utils);
51 private static CharSequence getChildSizeFromSchema(final DataNodeContainer node) {
52 return Integer.toString(node.getChildNodes().size());
56 protected DataObjectSerializerSource generateContainerSerializer(final GeneratedType type,
57 final ContainerSchemaNode node) {
58 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
60 public CharSequence emitStartEvent() {
61 return startContainerNode(classReference(type), UNKNOWN_SIZE);
67 protected DataObjectSerializerSource generateNotificationSerializer(final GeneratedType type,
68 final NotificationDefinition node) {
69 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
71 public CharSequence emitStartEvent() {
72 return startContainerNode(classReference(type), UNKNOWN_SIZE);
78 protected DataObjectSerializerSource generateCaseSerializer(final GeneratedType type, final ChoiceCaseNode node) {
79 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
81 public CharSequence emitStartEvent() {
82 return startCaseNode(classReference(type),UNKNOWN_SIZE);
88 protected DataObjectSerializerSource generateUnkeyedListEntrySerializer(final GeneratedType type,
89 final ListSchemaNode node) {
90 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
92 public CharSequence emitStartEvent() {
93 return startUnkeyedListItem(UNKNOWN_SIZE);
99 protected DataObjectSerializerSource generateSerializer(final GeneratedType type,
100 final AugmentationSchema schema) {
101 return new DataNodeContainerSerializerSource(this, type, schema) {
103 public CharSequence emitStartEvent() {
104 return startAugmentationNode(classReference(type));
110 protected DataObjectSerializerSource generateMapEntrySerializer(final GeneratedType type,
111 final ListSchemaNode node) {
112 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
114 public CharSequence emitStartEvent() {
115 return startMapEntryNode(invoke(INPUT, "getKey"), UNKNOWN_SIZE);