Fixed situation when xmlClass property was not serialized.
[yangtools.git] / code-generator / binding-generator-impl / src / main / java / org / opendaylight / yangtools / sal / binding / generator / impl / TransformerGenerator.xtend
index aaf07d5bfa14e347e7af68c4dd2c0d4655a10e88..0dc904b1083b907bc76dce4abd7d37c653fc43f2 100644 (file)
@@ -72,6 +72,7 @@ import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit
 import java.util.Set
 import org.opendaylight.yangtools.sal.binding.generator.util.XtendHelper
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition
+import org.opendaylight.yangtools.yang.binding.BindingMapping
 
 class TransformerGenerator {
 
@@ -113,6 +114,9 @@ class TransformerGenerator {
     @Property
     var GeneratorListener listener;
 
+    @Property
+    var extension GeneratedClassLoadingStrategy classLoadingStrategy
+
     public static val CLASS_TYPE = Types.typeForClass(Class);
 
     public new(ClassPool pool) {
@@ -121,6 +125,8 @@ class TransformerGenerator {
 
         BINDING_CODEC = BindingCodec.asCtClass;
         ctQName = QName.asCtClass
+
+        classLoadingStrategy = GeneratedClassLoadingStrategy.TCCLClassLoadingStrategy;
     }
 
     def Class<? extends BindingCodec<Map<QName, Object>, Object>> transformerFor(Class<?> inputType) {
@@ -154,7 +160,7 @@ class TransformerGenerator {
                 typeSpecBuilder = pathToType.get(node.path);
             }
             var schemaNode = typeToSchemaNode.get(ref);
-            if(schemaNode === null) {
+            if (schemaNode === null) {
                 schemaNode = node;
             }
             checkState(typeSpecBuilder !== null, "Could not find TypeDefinition for %s, $s", inputType.name, node);
@@ -198,7 +204,7 @@ class TransformerGenerator {
     def Class<? extends BindingCodec<Map<QName, Object>, Object>> keyTransformerForIdentifiable(Class<?> parentType) {
         return withClassLoaderAndLock(parentType.classLoader, lock) [ |
             val inputName = parentType.name + "Key";
-            val inputType = loadClassWithTCCL(inputName);
+            val inputType = loadClass(inputName);
             val ret = getGeneratedClass(inputType)
             if (ret !== null) {
                 return ret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
@@ -247,24 +253,24 @@ class TransformerGenerator {
     private def Class<?> getGeneratedClass(Class<? extends Object> cls) {
 
         try {
-            return loadClassWithTCCL(cls.codecClassName)
+            return loadClass(cls.codecClassName)
         } catch (ClassNotFoundException e) {
             return null;
         }
     }
 
     private def Class<?> keyTransformer(GeneratedType type, ListSchemaNode node) {
-        val cls = loadClassWithTCCL(type.resolvedName + "Key");
+        val cls = loadClass(type.resolvedName + "Key");
         keyTransformerFor(cls, type, node);
     }
 
     private def serializer(Type type, DataSchemaNode node) {
-        val cls = loadClassWithTCCL(type.resolvedName);
+        val cls = loadClass(type.resolvedName);
         transformerFor(cls, node);
     }
 
     private def Class<?> valueSerializer(GeneratedTransferObject type, TypeDefinition<?> typeDefinition) {
-        val cls = loadClassWithTCCL(type.resolvedName);
+        val cls = loadClass(type.resolvedName);
         val transformer = cls.generatedClass;
         if (transformer !== null) {
             return transformer;
@@ -281,7 +287,7 @@ class TransformerGenerator {
     }
 
     private def Class<?> valueSerializer(Enumeration type, TypeDefinition<?> typeDefinition) {
-        val cls = loadClassWithTCCL(type.resolvedName);
+        val cls = loadClass(type.resolvedName);
         val transformer = cls.generatedClass;
         if (transformer !== null) {
             return transformer;
@@ -543,7 +549,7 @@ class TransformerGenerator {
                     bodyChecked = '''
                         {
                             «QName.name» _localQName = QNAME;
-
+                        
                             if($2 == null) {
                             return null;
                             }
@@ -552,12 +558,12 @@ class TransformerGenerator {
                             «type.builderName» _builder = new «type.builderName»();
                             boolean _is_empty = true;
                             «FOR child : node.childNodes»
-                                «val signature = properties.getFor(child)»
-                                «deserializeProperty(child, signature.value, signature.key)»
-                                _builder.«signature.key.toSetter»(«signature.key»);
+                            «val signature = properties.getFor(child)»
+                            «deserializeProperty(child, signature.value, signature.key)»
+                            _builder.«signature.key.toSetter»(«signature.key»);
                             «ENDFOR»
                             if(_is_empty) {
-                                return null;
+                            return null;
                             }
                             return _builder.build();
                         }
@@ -676,20 +682,7 @@ class TransformerGenerator {
         }
     }
 
-    private def dispatch String deserializeBodyImpl(GeneratedType type, SchemaNode node) '''
-        {
-            «QName.name» _localQName = «QName.name».create($1,QNAME.getLocalName());
-
-            if($2 == null) {
-                return null;
-            }
-            java.util.Map _compositeNode = (java.util.Map) $2;
-            «type.builderName» _builder = new «type.builderName»();
-            return _builder.build();
-        }
-    '''
-
-    private def dispatch String deserializeBodyImpl(GeneratedType type, ListSchemaNode node) '''
+    private def String deserializeBodyWithAugmentations(GeneratedType type, DataNodeContainer node) '''
         {
             «QName.name» _localQName = «QName.name».create($1,QNAME.getLocalName());
             if($2 == null) {
@@ -698,29 +691,26 @@ class TransformerGenerator {
             java.util.Map _compositeNode = (java.util.Map) $2;
             //System.out.println(_localQName + " " + _compositeNode);
             «type.builderName» _builder = new «type.builderName»();
-            «deserializeKey(type, node)»
             «deserializeDataNodeContainerBody(type, node)»
             «deserializeAugmentations»
             return _builder.build();
         }
     '''
 
-    private def dispatch String deserializeBodyImpl(GeneratedType type, ContainerSchemaNode node) '''
+    private def dispatch String deserializeBodyImpl(GeneratedType type, SchemaNode node) '''
         {
             «QName.name» _localQName = «QName.name».create($1,QNAME.getLocalName());
+        
             if($2 == null) {
-                return null;
+            return null;
             }
             java.util.Map _compositeNode = (java.util.Map) $2;
-            //System.out.println(_localQName + " " + _compositeNode);
             «type.builderName» _builder = new «type.builderName»();
-            «deserializeDataNodeContainerBody(type, node)»
-            «deserializeAugmentations»
             return _builder.build();
         }
     '''
-    
-    private def dispatch String deserializeBodyImpl(GeneratedType type, NotificationDefinition node) '''
+
+    private def dispatch String deserializeBodyImpl(GeneratedType type, ListSchemaNode node) '''
         {
             «QName.name» _localQName = «QName.name».create($1,QNAME.getLocalName());
             if($2 == null) {
@@ -729,27 +719,24 @@ class TransformerGenerator {
             java.util.Map _compositeNode = (java.util.Map) $2;
             //System.out.println(_localQName + " " + _compositeNode);
             «type.builderName» _builder = new «type.builderName»();
+            «deserializeKey(type, node)»
             «deserializeDataNodeContainerBody(type, node)»
             «deserializeAugmentations»
             return _builder.build();
         }
     '''
 
-    private def dispatch String deserializeBodyImpl(GeneratedType type, ChoiceCaseNode node) '''
-        {
-            «QName.name» _localQName = «QName.name».create($1,QNAME.getLocalName());
+    private def dispatch String deserializeBodyImpl(GeneratedType type, ContainerSchemaNode node) {
+        return deserializeBodyWithAugmentations(type, node);
+    }
 
-            if($2 == null) {
-                return null;
-            }
-            java.util.Map _compositeNode = (java.util.Map) $2;
-            //System.out.println(_localQName + " " + _compositeNode);
-            «type.builderName» _builder = new «type.builderName»();
-            «deserializeDataNodeContainerBody(type, node)»
-            «deserializeAugmentations»
-            return _builder.build();
-        }
-    '''
+    private def dispatch String deserializeBodyImpl(GeneratedType type, NotificationDefinition node) {
+        return deserializeBodyWithAugmentations(type, node);
+    }
+
+    private def dispatch String deserializeBodyImpl(GeneratedType type, ChoiceCaseNode node) {
+        return deserializeBodyWithAugmentations(type, node);
+    }
 
     private def deserializeDataNodeContainerBody(GeneratedType type, DataNodeContainer node) {
         deserializeNodeContainerBodyImpl(type, type.allProperties, node);
@@ -806,7 +793,7 @@ class TransformerGenerator {
                 _hasNext = _iterator.hasNext();
             }
         }
-
+        
         ////System.out.println(" list" + «propertyName»);
     '''
 
@@ -897,9 +884,9 @@ class TransformerGenerator {
                     bodyChecked = '''
                         {
                             ////System.out.println("«inputType.simpleName»#toDomValue: "+$1);
-
+                        
                             if($1 == null) {
-                                return null;
+                            return null;
                             }
                             «typeSpec.resolvedName» _encapsulatedValue = («typeSpec.resolvedName») $1;
                             ////System.out.println("«inputType.simpleName»#toDomValue:Enc: "+_encapsulatedValue);
@@ -922,9 +909,9 @@ class TransformerGenerator {
                     bodyChecked = '''
                         {
                             ////System.out.println("«inputType.simpleName»#fromDomValue: "+$1);
-
+                        
                             if($1 == null) {
-                                return null;
+                            return null;
                             }
                             «returnType.resolvedName» _simpleValue = «deserializeValue(returnType, "$1", null)»;
                             «typeSpec.resolvedName» _value = new «typeSpec.resolvedName»(_simpleValue);
@@ -956,7 +943,7 @@ class TransformerGenerator {
         try {
             val ctCls = createClass(typeSpec.codecClassName) [
                 val properties = typeSpec.allProperties;
-                val getterToTypeDefinition = XtendHelper.getTypes(typeDef).toMap[type | type.QName.getterName];
+                val getterToTypeDefinition = XtendHelper.getTypes(typeDef).toMap[type|type.QName.getterName];
                 //staticField(Map,"AUGMENTATION_SERIALIZERS");
                 if (inputType.isYangBindingAvailable) {
                     implementsType(BINDING_CODEC)
@@ -967,25 +954,25 @@ class TransformerGenerator {
                 method(Object, "toDomValue", Object) [
                     modifiers = PUBLIC + FINAL + STATIC
                     val ctSpec = inputType.asCtClass;
-
                     bodyChecked = '''
                         {
                             ////System.out.println("«inputType.simpleName»#toDomValue: "+$1);
-
+                        
                             if($1 == null) {
-                                return null;
+                            return null;
                             }
                             «typeSpec.resolvedName» _value = («typeSpec.resolvedName») $1;
                             «FOR property : properties.entrySet»
-                                «IF property.key != "getValue"»
-                                    «property.value.resolvedName» «property.key» = («property.value.resolvedName») _value.«property.
+                            «IF property.key != "getValue"»
+                                «property.value.resolvedName» «property.key» = («property.value.resolvedName») _value.«property.
                             key»();
-                                    if(«property.key» != null) {
-                                        return «serializeValue(property.value, property.key, getterToTypeDefinition.get(property.key))»;
-                                    }
-                                «ENDIF»
+                                if(«property.key» != null) {
+                                    return «serializeValue(property.value, property.key,
+                            getterToTypeDefinition.get(property.key))»;
+                                }
+                            «ENDIF»
                             «ENDFOR»
-
+                        
                             return null;
                         }
                     '''
@@ -1002,13 +989,13 @@ class TransformerGenerator {
                     bodyChecked = '''
                         {
                             ////System.out.println("«inputType.simpleName»#fromDomValue: "+$1);
-
+                        
                             if($1 == null) {
-                                return null;
+                            return null;
                             }
                             if($1 instanceof String) {
-                                String _simpleValue = (String) $1;
-                                return new «typeSpec.resolvedName»(_simpleValue.toCharArray());
+                            String _simpleValue = (String) $1;
+                            return new «typeSpec.resolvedName»(_simpleValue.toCharArray());
                             }
                             return null;
                         }
@@ -1033,7 +1020,6 @@ class TransformerGenerator {
         }
     }
 
-
     private def dispatch Class<? extends BindingCodec<Map<QName, Object>, Object>> generateValueTransformer(
         Class<?> inputType, GeneratedTransferObject typeSpec, BitsTypeDefinition typeDef) {
         try {
@@ -1051,23 +1037,23 @@ class TransformerGenerator {
                     bodyChecked = '''
                         {
                             ////System.out.println("«inputType.simpleName»#toDomValue: "+$1);
-
+                        
                             if($1 == null) {
-                                return null;
+                            return null;
                             }
                             «typeSpec.resolvedName» _encapsulatedValue = («typeSpec.resolvedName») $1;
                             «HashSet.resolvedName» _value = new «HashSet.resolvedName»();
                             //System.out.println("«inputType.simpleName»#toDomValue:Enc: "+_encapsulatedValue);
-
+                        
                             «FOR bit : typeDef.bits»
-                                «val getter = bit.getterName()»
-                                if(Boolean.TRUE.equals(_encapsulatedValue.«getter»())) {
-                                    _value.add("«bit.name»");
-                                }
+                            «val getter = bit.getterName()»
+                            if(Boolean.TRUE.equals(_encapsulatedValue.«getter»())) {
+                                _value.add("«bit.name»");
+                            }
                             «ENDFOR»
                             «Set.resolvedName» _domValue =  «Collections.resolvedName».unmodifiableSet(_value);
                             //System.out.println("«inputType.simpleName»#toDomValue:DeEnc: "+_domValue);
-
+                        
                             return _domValue;
                         }
                     '''
@@ -1085,15 +1071,15 @@ class TransformerGenerator {
                     bodyChecked = '''
                         {
                             //System.out.println("«inputType.simpleName»#fromDomValue: "+$1);
-
+                        
                             if($1 == null) {
-                                return null;
+                            return null;
                             }
                             «Set.resolvedName» _domValue = («Set.resolvedName») $1;
                             «FOR bit : sortedBits»
-                                Boolean «bit.propertyName» = Boolean.valueOf(_domValue.contains("«bit.name»"));
+                            Boolean «bit.propertyName» = Boolean.valueOf(_domValue.contains("«bit.name»"));
                             «ENDFOR»
-
+                        
                             return new «inputType.resolvedName»(«FOR bit : sortedBits SEPARATOR ","»«bit.propertyName»«ENDFOR»);
                         }
                     '''
@@ -1325,40 +1311,32 @@ class TransformerGenerator {
             '''«QName.asCtClass.name».create("«node.namespace»","«node.formattedRevision»","«node.localName»")''')
     }
 
-    private def dispatch String serializeBody(GeneratedType type, ListSchemaNode node) '''
+    private def String serializeBodyImpl(GeneratedType type, DataNodeContainer nodeContainer) '''
         {
             «QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
             java.util.List _childNodes = new java.util.ArrayList();
             «type.resolvedName» value = («type.resolvedName») $2;
-            «transformDataContainerBody(type, type.allProperties, node)»
+            «transformDataContainerBody(type, type.allProperties, nodeContainer
             «serializeAugmentations»
             return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
         }
     '''
 
-    private def dispatch String serializeBody(GeneratedType type, NotificationDefinition node) '''
-        {
-            «QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
-            java.util.List _childNodes = new java.util.ArrayList();
-            «type.resolvedName» value = («type.resolvedName») $2;
-            «transformDataContainerBody(type, type.allProperties, node)»
-            «serializeAugmentations»
-            return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
-        }
-    '''
-    
-    
+    private def dispatch String serializeBody(GeneratedType type, ListSchemaNode node) {
+        return serializeBodyImpl(type, node);
+    }
 
-    private def dispatch String serializeBody(GeneratedType type, ChoiceCaseNode node) '''
-        {
-        «QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
-            java.util.List _childNodes = new java.util.ArrayList();
-            «type.resolvedName» value = («type.resolvedName») $2;
-            «transformDataContainerBody(type, type.allProperties, node)»
-            «serializeAugmentations»
-            return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
-        }
-    '''
+    private def dispatch String serializeBody(GeneratedType type, NotificationDefinition node) {
+        return serializeBodyImpl(type, node);
+    }
+
+    private def dispatch String serializeBody(GeneratedType type, ContainerSchemaNode node) {
+        return serializeBodyImpl(type, node);
+    }
+
+    private def dispatch String serializeBody(GeneratedType type, ChoiceCaseNode node) {
+        return serializeBodyImpl(type, node);
+    }
 
     private def dispatch String serializeBody(GeneratedType type, SchemaNode node) '''
         {
@@ -1402,15 +1380,15 @@ class TransformerGenerator {
     }
 
     private static def String getBooleanGetterName(DataSchemaNode node) {
-        return "is" + BindingGeneratorUtil.parseToClassName(node.QName.localName);
+        return "is" + BindingMapping.getPropertyName(node.QName.localName).toFirstUpper;
     }
 
     private static def String getGetterName(DataSchemaNode node) {
-        return "get" + BindingGeneratorUtil.parseToClassName(node.QName.localName);
+        return "get" + BindingMapping.getPropertyName(node.QName.localName).toFirstUpper;
     }
 
     private static def String getGetterName(QName node) {
-        return "get" + BindingGeneratorUtil.parseToClassName(node.localName);
+        return "get" + BindingMapping.getPropertyName(node.localName).toFirstUpper;
     }
 
     private def dispatch CharSequence serializeProperty(ListSchemaNode schema, ParameterizedType type,
@@ -1431,7 +1409,7 @@ class TransformerGenerator {
 
     private def dispatch CharSequence serializeProperty(LeafSchemaNode schema, Type type, String propertyName) '''
         «type.resolvedName» «propertyName» = value.«propertyName»();
-
+        
         if(«propertyName» != null) {
             «QName.name» _qname = «QName.name».create(_resultName,"«schema.QName.localName»");
             Object _propValue = «serializeValue(type, propertyName, schema.type)»;
@@ -1557,7 +1535,7 @@ class TransformerGenerator {
     }
 
     def CtClass asCtClass(Type type) {
-        val cls = loadClassWithTCCL(type.fullyQualifiedName)
+        val cls = loadClass(type.fullyQualifiedName)
         return cls.asCtClass;
     }