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.yangtools.binding.data.codec.gen.impl;
10 import com.google.common.base.Preconditions;
11 import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
12 import org.opendaylight.mdsal.binding.model.api.Type;
13 import org.opendaylight.yangtools.binding.data.codec.gen.spi.AbstractSource;
14 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
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;
20 abstract class DataObjectSerializerSource extends AbstractSource {
22 private static final ClassLoadingStrategy STRATEGY = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
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";
30 private final AbstractGenerator generator;
33 * @param generator Parent generator
35 DataObjectSerializerSource(final AbstractGenerator generator) {
36 this.generator = Preconditions.checkNotNull(generator);
39 @SuppressWarnings("unchecked")
40 protected Class<? extends DataContainer> loadClass(final Type childType) {
42 return (Class<? extends DataContainer>) STRATEGY.loadClass(childType);
43 } catch (final ClassNotFoundException e) {
44 throw new IllegalStateException("Could not load referenced class ", e);
49 * Returns body of static serialize method.
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.
57 * @return Valid javassist code describing static serialization body.
59 protected abstract CharSequence getSerializerBody();
61 protected final CharSequence leafNode(final String localName, final CharSequence value) {
62 return invoke(STREAM, "leafNode", escape(localName), value);
65 protected final CharSequence startLeafSet(final String localName,final CharSequence expected) {
66 return invoke(STREAM, "startLeafSet", escape(localName),expected);
69 protected final CharSequence startOrderedLeafSet(final String localName, final CharSequence expected) {
70 return invoke(STREAM, "startOrderedLeafSet", escape(localName),expected);
73 protected final CharSequence leafSetEntryNode(final CharSequence value) {
74 return invoke(STREAM, "leafSetEntryNode", value);
77 protected final CharSequence startContainerNode(final CharSequence type, final CharSequence expected) {
78 return invoke(STREAM, "startContainerNode", (type),expected);
81 protected final CharSequence escape(final String localName) {
82 return '"' + localName + '"';
85 protected final CharSequence startUnkeyedList(final CharSequence type, final CharSequence expected) {
86 return invoke(STREAM, "startUnkeyedList", (type),expected);
89 protected final CharSequence startUnkeyedListItem(final CharSequence expected) {
90 return invoke(STREAM, "startUnkeyedListItem",expected);
93 protected final CharSequence startMapNode(final CharSequence type,final CharSequence expected) {
94 return invoke(STREAM, "startMapNode", (type),expected);
97 protected final CharSequence startOrderedMapNode(final CharSequence type,final CharSequence expected) {
98 return invoke(STREAM, "startOrderedMapNode", (type),expected);
101 protected final CharSequence startMapEntryNode(final CharSequence key, final CharSequence expected) {
102 return invoke(STREAM,"startMapEntryNode",key,expected);
105 protected final CharSequence startAugmentationNode(final CharSequence key) {
106 return invoke(STREAM,"startAugmentationNode",key);
109 protected final CharSequence startChoiceNode(final CharSequence localName,final CharSequence expected) {
110 return invoke(STREAM, "startChoiceNode", (localName),expected);
113 protected final CharSequence startCaseNode(final CharSequence localName,final CharSequence expected) {
114 return invoke(STREAM, "startCase", (localName),expected);
117 protected final CharSequence anyxmlNode(final String name, final String value) throws IllegalArgumentException {
118 return invoke(STREAM, "anyxmlNode", escape(name),name);
121 protected final CharSequence endNode() {
122 return invoke(STREAM, "endNode");
125 protected final CharSequence forEach(final String iterable,final Type valueType,final CharSequence body) {
126 return forEach(iterable, ITERATOR, valueType.getFullyQualifiedName(), CURRENT, body);
129 protected final CharSequence classReference(final Type type) {
130 return type.getFullyQualifiedName() + ".class";
133 protected final CharSequence staticInvokeEmitter(final Type childType, final String name) {
136 cls = STRATEGY.loadClass(childType);
137 } catch (final ClassNotFoundException e) {
138 throw new IllegalStateException("Failed to invoke emitter", e);
141 final String className = this.generator.loadSerializerFor(cls) + ".getInstance()";
142 return invoke(className, AbstractStreamWriterGenerator.SERIALIZE_METHOD_NAME, REGISTRY, name, STREAM);