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.mdsal.binding.spec.naming.BindingMapping;
15 import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
16 import org.opendaylight.yangtools.yang.binding.DataObject;
17 import org.opendaylight.yangtools.yang.binding.DataObjectSerializerImplementation;
18 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
19 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
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);
52 protected DataObjectSerializerSource generateContainerSerializer(final GeneratedType type,
53 final ContainerSchemaNode node) {
54 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
56 public CharSequence emitStartEvent() {
57 return startContainerNode(classReference(type), UNKNOWN_SIZE);
63 protected DataObjectSerializerSource generateNotificationSerializer(final GeneratedType type,
64 final NotificationDefinition node) {
65 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
67 public CharSequence emitStartEvent() {
68 return startContainerNode(classReference(type), UNKNOWN_SIZE);
74 protected DataObjectSerializerSource generateCaseSerializer(final GeneratedType type, final CaseSchemaNode node) {
75 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
77 public CharSequence emitStartEvent() {
78 return startCaseNode(classReference(type),UNKNOWN_SIZE);
84 protected DataObjectSerializerSource generateUnkeyedListEntrySerializer(final GeneratedType type,
85 final ListSchemaNode node) {
86 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
88 public CharSequence emitStartEvent() {
89 return startUnkeyedListItem(UNKNOWN_SIZE);
95 protected DataObjectSerializerSource generateSerializer(final GeneratedType type,
96 final AugmentationSchemaNode schema) {
97 return new DataNodeContainerSerializerSource(this, type, schema) {
99 public CharSequence emitStartEvent() {
100 return startAugmentationNode(classReference(type));
106 protected DataObjectSerializerSource generateMapEntrySerializer(final GeneratedType type,
107 final ListSchemaNode node) {
108 return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
110 public CharSequence emitStartEvent() {
111 return startMapEntryNode(invoke(INPUT, BindingMapping.IDENTIFIABLE_KEY_NAME), UNKNOWN_SIZE);