Switch to Objects.requireNonNull
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / gen / impl / DataObjectSerializerSource.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.mdsal.binding.dom.codec.gen.impl;
9
10 import static java.util.Objects.requireNonNull;
11
12 import org.opendaylight.mdsal.binding.dom.codec.gen.spi.AbstractSource;
13 import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
14 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
15 import org.opendaylight.mdsal.binding.model.api.Type;
16 import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
17 import org.opendaylight.yangtools.yang.binding.DataContainer;
18 import org.opendaylight.yangtools.yang.binding.DataObject;
19 import org.opendaylight.yangtools.yang.binding.DataObjectSerializerRegistry;
20
21 abstract class DataObjectSerializerSource extends AbstractSource {
22
23     private static final ClassLoadingStrategy STRATEGY = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
24
25     protected static final String SERIALIZER = "_serializer";
26     protected static final String STREAM = "_stream";
27     protected static final String ITERATOR = "_iterator";
28     protected static final String CURRENT = "_current";
29     protected static final String REGISTRY = "_registry";
30
31     private final AbstractGenerator generator;
32
33     /**
34      * Create a new source.
35      *
36      * @param generator Parent generator
37      */
38     DataObjectSerializerSource(final AbstractGenerator generator) {
39         this.generator = requireNonNull(generator);
40     }
41
42     @SuppressWarnings("unchecked")
43     protected Class<? extends DataContainer> loadClass(final Type childType) {
44         try {
45             return (Class<? extends DataContainer>) STRATEGY.loadClass(childType);
46         } catch (final ClassNotFoundException e) {
47             throw new IllegalStateException("Could not load referenced class ", e);
48         }
49     }
50
51     /**
52      * Returns body of static serialize method.
53      *
54      * <ul>
55      * <li> {@link DataObjectSerializerRegistry} - registry of serializers
56      * <li> {@link DataObject} - object to be serialized
57      * <li> {@link BindingStreamEventWriter} - writer to which events should be serialized.
58      * </ul>
59      *
60      * @return Valid javassist code describing static serialization body.
61      */
62     protected abstract CharSequence getSerializerBody();
63
64     protected static final CharSequence leafNode(final String localName, final CharSequence value) {
65         return invoke(STREAM, "leafNode", escape(localName), value);
66     }
67
68     protected static final CharSequence startLeafSet(final String localName,final CharSequence expected) {
69         return invoke(STREAM, "startLeafSet", escape(localName), expected);
70     }
71
72     protected static final CharSequence startOrderedLeafSet(final String localName, final CharSequence expected) {
73         return invoke(STREAM, "startOrderedLeafSet", escape(localName), expected);
74     }
75
76     protected static final CharSequence leafSetEntryNode(final CharSequence value) {
77         return invoke(STREAM, "leafSetEntryNode", value);
78     }
79
80     protected static final CharSequence startContainerNode(final CharSequence type, final CharSequence expected) {
81         return invoke(STREAM, "startContainerNode", type, expected);
82     }
83
84     protected static final CharSequence escape(final String localName) {
85         return '"' + localName + '"';
86     }
87
88     protected static final CharSequence startUnkeyedList(final CharSequence type, final CharSequence expected) {
89         return invoke(STREAM, "startUnkeyedList", type, expected);
90     }
91
92     protected static final CharSequence startUnkeyedListItem(final CharSequence expected) {
93         return invoke(STREAM, "startUnkeyedListItem", expected);
94     }
95
96     protected static final CharSequence startMapNode(final CharSequence type,final CharSequence expected) {
97         return invoke(STREAM, "startMapNode", type, expected);
98     }
99
100     protected static final CharSequence startOrderedMapNode(final CharSequence type,final CharSequence expected) {
101         return invoke(STREAM, "startOrderedMapNode", type, expected);
102     }
103
104     protected static final CharSequence startMapEntryNode(final CharSequence key, final CharSequence expected) {
105         return invoke(STREAM, "startMapEntryNode", key, expected);
106     }
107
108     protected static final CharSequence startAugmentationNode(final CharSequence key) {
109         return invoke(STREAM, "startAugmentationNode", key);
110     }
111
112     protected static final CharSequence startChoiceNode(final CharSequence localName,final CharSequence expected) {
113         return invoke(STREAM, "startChoiceNode", localName, expected);
114     }
115
116     protected static final CharSequence startCaseNode(final CharSequence localName,final CharSequence expected) {
117         return invoke(STREAM, "startCase", localName, expected);
118     }
119
120     protected static final CharSequence anyxmlNode(final String name, final String value)
121             throws IllegalArgumentException {
122         return invoke(STREAM, "anyxmlNode", escape(name), name);
123     }
124
125     protected static final CharSequence endNode() {
126         return invoke(STREAM, "endNode");
127     }
128
129     protected static final CharSequence forEach(final String iterable,final Type valueType,final CharSequence body) {
130         return forEach(iterable, ITERATOR, valueType.getFullyQualifiedName(), CURRENT, body);
131     }
132
133     protected static final CharSequence classReference(final Type type) {
134         return type.getFullyQualifiedName() + ".class";
135     }
136
137     protected final CharSequence staticInvokeEmitter(final Type childType, final String name) {
138         final Class<?> cls;
139         try {
140             cls = STRATEGY.loadClass(childType);
141         } catch (final ClassNotFoundException e) {
142             throw new IllegalStateException("Failed to invoke emitter", e);
143         }
144
145         final String className = this.generator.loadSerializerFor(cls) + ".getInstance()";
146         return invoke(className, AbstractStreamWriterGenerator.SERIALIZE_METHOD_NAME, REGISTRY, name, STREAM);
147     }
148 }