46c6ab2580f41b19cdd1eef113a4190d81061235
[mdsal.git] / code-generator / binding-data-codec / src / main / java / org / opendaylight / yangtools / binding / data / codec / gen / impl / StreamWriterGenerator.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.binding.data.codec.gen.impl;
9
10 import org.opendaylight.yangtools.binding.data.codec.util.AugmentableDispatchSerializer;
11 import org.opendaylight.yangtools.binding.data.codec.util.ChoiceDispatchSerializer;
12 import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
13 import org.opendaylight.yangtools.sal.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;
23
24 /**
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}.
28  *
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.
34  *
35  */
36 public class StreamWriterGenerator extends AbstractStreamWriterGenerator {
37
38
39     private static final String UNKNOWN_SIZE = BindingStreamEventWriter.class.getName() + ".UNKNOWN_SIZE";
40
41     private StreamWriterGenerator(final JavassistUtils utils, final Void ignore) {
42         super(utils);
43     }
44
45     /**
46      * Deprecated, use {@link #create(JavassistUtils)} instead.
47      * @param utils
48      */
49     @Deprecated
50     public StreamWriterGenerator(final JavassistUtils utils) {
51         this(utils, null);
52     }
53
54     /**
55      * Create a new instance backed by a specific {@link JavassistUtils} instance.
56      *
57      * @param utils JavassistUtils instance to use
58      * @return A new generator
59      */
60     public static DataObjectSerializerGenerator create(final JavassistUtils utils) {
61         return new StreamWriterGenerator(utils, null);
62     }
63
64     private static CharSequence getChildSizeFromSchema(final DataNodeContainer node) {
65         return Integer.toString(node.getChildNodes().size());
66     }
67
68
69     @Override
70     protected DataObjectSerializerSource generateContainerSerializer(final GeneratedType type, final ContainerSchemaNode node) {
71
72         return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
73             @Override
74             public CharSequence emitStartEvent() {
75                 return startContainerNode(classReference(type), UNKNOWN_SIZE);
76             }
77         };
78     }
79
80     @Override
81     protected DataObjectSerializerSource generateNotificationSerializer(final GeneratedType type, final NotificationDefinition node) {
82
83         return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
84             @Override
85             public CharSequence emitStartEvent() {
86                 return startContainerNode(classReference(type), UNKNOWN_SIZE);
87             }
88         };
89     }
90
91     @Override
92     protected DataObjectSerializerSource generateCaseSerializer(final GeneratedType type, final ChoiceCaseNode node) {
93         return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
94             @Override
95             public CharSequence emitStartEvent() {
96                 return startCaseNode(classReference(type),UNKNOWN_SIZE);
97             }
98         };
99     }
100
101     @Override
102     protected DataObjectSerializerSource generateUnkeyedListEntrySerializer(final GeneratedType type, final ListSchemaNode node) {
103         return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
104
105             @Override
106             public CharSequence emitStartEvent() {
107                 return startUnkeyedListItem(UNKNOWN_SIZE);
108             }
109         };
110     }
111
112     @Override
113     protected DataObjectSerializerSource generateSerializer(final GeneratedType type, final AugmentationSchema schema) {
114         return new DataNodeContainerSerializerSource(this, type, schema) {
115
116             @Override
117             public CharSequence emitStartEvent() {
118                 return startAugmentationNode(classReference(type));
119             }
120         };
121     }
122
123     @Override
124     protected DataObjectSerializerSource generateMapEntrySerializer(final GeneratedType type, final ListSchemaNode node) {
125         return new AugmentableDataNodeContainerEmitterSource(this, type, node) {
126             @Override
127             public CharSequence emitStartEvent() {
128                 return startMapEntryNode(invoke(INPUT, "getKey"), UNKNOWN_SIZE);
129             }
130         };
131     }
132 }