Rework DataObjectSerializer implementations
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / gen / impl / DataNodeContainerSerializerSource.java
index aaeb898ff087473a2140828b77a0c5b312691b92..e4261182e9fe0083aeb4db06b9eab286163bc5a3 100644 (file)
@@ -5,18 +5,19 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.mdsal.binding.dom.codec.gen.impl;
 
-import com.google.common.base.Preconditions;
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
 import java.util.HashMap;
 import java.util.Map;
+import org.opendaylight.mdsal.binding.dom.codec.util.BindingSchemaMapping;
 import org.opendaylight.mdsal.binding.dom.codec.util.ChoiceDispatchSerializer;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
 import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
 import org.opendaylight.mdsal.binding.model.api.Type;
-import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.binding.BindingSerializer;
 import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -30,13 +31,10 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Deprecated
 abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSource {
 
     private static final Logger LOG = LoggerFactory.getLogger(DataNodeContainerSerializerSource.class);
@@ -50,8 +48,8 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
     DataNodeContainerSerializerSource(final AbstractGenerator generator, final GeneratedType type,
             final DataNodeContainer node) {
         super(generator);
-        this.dtoType = Preconditions.checkNotNull(type);
-        this.schemaNode = Preconditions.checkNotNull(node);
+        this.dtoType = requireNonNull(type);
+        this.schemaNode = requireNonNull(node);
     }
 
     /**
@@ -63,29 +61,28 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
 
     @Override
     protected CharSequence getSerializerBody() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append("{\n");
-        sb.append(statement(assign(DataObjectSerializerRegistry.class.getName(), REGISTRY, "$1")));
-        sb.append(statement(assign(dtoType.getFullyQualifiedName(), INPUT,
-                cast(dtoType.getFullyQualifiedName(), "$2"))));
-        sb.append(statement(assign(BindingStreamEventWriter.class.getName(), STREAM,
-            cast(BindingStreamEventWriter.class.getName(), "$3"))));
-        sb.append(statement(assign(BindingSerializer.class.getName(), SERIALIZER, null)));
-        sb.append("if (");
-        sb.append(STREAM);
-        sb.append(" instanceof ");
-        sb.append(BindingSerializer.class.getName());
-        sb.append(") {");
-        sb.append(statement(assign(SERIALIZER, cast(BindingSerializer.class.getName(), STREAM))));
-        sb.append('}');
-        sb.append(statement(emitStartEvent()));
+        final StringBuilder sb = new StringBuilder()
+                .append("{\n")
+                .append(statement(assign(DataObjectSerializerRegistry.class, REGISTRY, "$1")))
+                .append(statement(assign(dtoType, INPUT, cast(dtoType, "$2"))))
+                .append(statement(assign(BindingStreamEventWriter.class, STREAM,
+                    cast(BindingStreamEventWriter.class, "$3"))))
+                .append(statement(assign(BindingSerializer.class, SERIALIZER, null)))
+                .append("if (")
+                .append(STREAM)
+                .append(" instanceof ")
+                .append(BindingSerializer.class.getName())
+                .append(") {")
+                .append(statement(assign(SERIALIZER, cast(BindingSerializer.class, STREAM))))
+                .append('}')
+                .append(statement(emitStartEvent()));
 
         emitBody(sb);
         emitAfterBody(sb);
-        sb.append(statement(endNode()));
-        sb.append(statement("return null"));
-        sb.append('}');
-        return sb;
+
+        return sb.append(statement(endNode()))
+                .append(statement("return null"))
+                .append('}');
     }
 
     /**
@@ -108,46 +105,14 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
         return hashMap;
     }
 
-    private static String getGetterName(final DataSchemaNode node) {
-        final TypeDefinition<?> type;
-        if (node instanceof TypedDataSchemaNode) {
-            type = ((TypedDataSchemaNode) node).getType();
-        } else {
-            type = null;
-        }
-
-        final String prefix;
-        // Bug 8903: If it is a derived type of boolean or empty, not an inner type, then the return type
-        // of method would be the generated type of typedef not build-in types, so here it should be 'get'.
-        if ((type instanceof BooleanTypeDefinition || type instanceof EmptyTypeDefinition)
-                && (type.getPath().equals(node.getPath()) || type.getBaseType() == null)) {
-            prefix = "is";
-        } else {
-            prefix = "get";
-        }
-        return prefix + BindingMapping.getGetterSuffix(node.getQName());
-    }
-
     private void emitBody(final StringBuilder sb) {
         final Map<String, Type> getterToType = collectAllProperties(dtoType, new HashMap<String, Type>());
         for (final DataSchemaNode schemaChild : schemaNode.getChildNodes()) {
             if (!schemaChild.isAugmenting()) {
-                final String getter = getGetterName(schemaChild);
+                final String getter = BindingSchemaMapping.getGetterMethodName(schemaChild);
                 final Type childType = getterToType.get(getter);
-                if (childType == null) {
-                    // FIXME AnyXml nodes are ignored, since their type cannot be found in generated bindnig
-                    // Bug-706 https://bugs.opendaylight.org/show_bug.cgi?id=706
-                    if (schemaChild instanceof AnyXmlSchemaNode) {
-                        LOG.warn("Node {} will be ignored. AnyXml is not yet supported from binding aware code."
-                                + "Binding Independent code can be used to serialize anyXml nodes.",
-                                schemaChild.getPath());
-                        continue;
-                    }
-
-                    throw new IllegalStateException(
-                        String.format("Unable to find type for child node %s. Expected child nodes: %s",
-                            schemaChild.getPath(), getterToType));
-                }
+                checkState(childType != null, "Unable to find type for child node %s. Expected child nodes: %s",
+                        schemaChild.getPath(), getterToType);
                 emitChild(sb, getter, childType, schemaChild);
             }
         }
@@ -184,26 +149,22 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
             final ListSchemaNode casted = (ListSchemaNode) child;
             emitList(sb, getterName, valueType, casted);
         } else if (child instanceof ContainerSchemaNode) {
-            sb.append(tryToUseCacheElse(getterName,statement(staticInvokeEmitter(childType, getterName))));
+            sb.append(tryToUseCacheElse(getterName, statement(staticInvokeEmitter(childType, getterName))));
         } else if (child instanceof ChoiceSchemaNode) {
             final String propertyName = CHOICE_PREFIX + childType.getName();
             staticConstant(propertyName, DataObjectSerializerImplementation.class,
                 ChoiceDispatchSerializer.from(loadClass(childType)));
-            sb.append(tryToUseCacheElse(getterName,statement(invoke(propertyName,
-                StreamWriterGenerator.SERIALIZE_METHOD_NAME, REGISTRY, cast(DataObject.class.getName(), getterName),
-                STREAM))));
+            sb.append(tryToUseCacheElse(getterName, statement(invoke(propertyName,
+                StreamWriterGenerator.SERIALIZE_METHOD_NAME, REGISTRY, cast(DataObject.class, getterName), STREAM))));
         }
     }
 
     private static StringBuilder tryToUseCacheElse(final String getterName, final CharSequence statement) {
-        final StringBuilder b = new StringBuilder();
-        b.append("if ( ");
-        b.append(SERIALIZER).append("== null || ");
-        b.append(invoke(SERIALIZER, "serialize", getterName)).append("== null");
-        b.append(") {");
-        b.append(statement);
-        b.append('}');
-        return b;
+        return new StringBuilder()
+                .append("if (").append(SERIALIZER).append(" == null || ")
+                .append(invoke(SERIALIZER, "serialize", getterName)).append(" == null) {\n")
+                .append(statement)
+                .append('}');
     }
 
     private void emitList(final StringBuilder sb, final String getterName, final Type valueType,