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