X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fbinding%2Fdom%2Fserializer%2Fimpl%2FTransformerGenerator.xtend;h=a732f152b25675612a21a3a6aad503c5971dbdaa;hb=f7ba165cc8c8118cabd051da77a3b1efd6d5a935;hp=01390d7c41612e819b3cffc9964538f66263bf38;hpb=0f14bf97fb20a4d506a7ed4826b2a6ed3b9ebeab;p=controller.git diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/TransformerGenerator.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/TransformerGenerator.xtend index 01390d7c41..a732f152b2 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/TransformerGenerator.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/TransformerGenerator.xtend @@ -45,6 +45,10 @@ import org.opendaylight.yangtools.yang.binding.Augmentation import java.util.Iterator import org.opendaylight.yangtools.yang.model.api.AugmentationSchema import java.util.concurrent.ConcurrentHashMap +import static extension org.opendaylight.controller.sal.binding.impl.util.YangSchemaUtils.*; +import org.opendaylight.yangtools.binding.generator.util.ReferencedTypeImpl +import org.opendaylight.yangtools.yang.model.util.ExtendedType +import org.opendaylight.yangtools.yang.model.util.EnumerationType class TransformerGenerator { @@ -214,7 +218,20 @@ class TransformerGenerator { if (transformer !== null) { return transformer; } - return withClassLoaderAndLock(cls.classLoader,lock) [| + return withClassLoaderAndLock(cls.classLoader, lock) [ | + val valueTransformer = generateValueTransformer(cls, type); + return valueTransformer; + ] + } + + private def Class getValueSerializer(Enumeration type) { + val cls = loadClassWithTCCL(type.resolvedName); + val transformer = cls.generatedClass; + if (transformer !== null) { + return transformer; + } + + return withClassLoaderAndLock(cls.classLoader, lock) [ | val valueTransformer = generateValueTransformer(cls, type); return valueTransformer; ] @@ -222,6 +239,7 @@ class TransformerGenerator { private def generateKeyTransformerFor(Class inputType, GeneratedType typeSpec, ListSchemaNode node) { try { + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val properties = typeSpec.allProperties; val ctCls = createClass(inputType.codecClassName) [ @@ -260,13 +278,15 @@ class TransformerGenerator { } «QName.name» _localQName = $1; java.util.Map _compositeNode = (java.util.Map) $2; + boolean _is_empty = true; «FOR key : node.keyDefinition» «val propertyName = key.getterName» «val keyDef = node.getDataChildByName(key)» «val property = properties.get(propertyName)» «deserializeProperty(keyDef, property, propertyName)»; «ENDFOR» - «inputType.resolvedName» _value = new «inputType.name»(«node.keyDefinition.keyConstructorList»); + «inputType.resolvedName» _value = new «inputType.name»(«node.keyDefinition. + keyConstructorList»); return _value; } ''' @@ -299,11 +319,12 @@ class TransformerGenerator { private def Class> generateCaseCodec(Class inputType, GeneratedType type, ChoiceCaseNode node) { try { + //log.info("Generating DOM Codec for {} with {}, TCCL is: {}", inputType, inputType.classLoader,Thread.currentThread.contextClassLoader) val ctCls = createClass(type.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); implementsType(BINDING_CODEC) - staticQNameField(inputType); + staticQNameField(node.QName); staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) staticField(it, AUGMENTATION_CODEC, BindingCodec) method(Object, "toDomStatic", QName, Object) [ @@ -313,7 +334,7 @@ class TransformerGenerator { «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, node)» return ($r) _childNodes; } ''' @@ -337,16 +358,18 @@ class TransformerGenerator { method(Object, "deserialize", Object) [ body = ''' { - - return fromDomStatic(QNAME,$1); + //System.out.println("«type.name»#deserialize: " +$1); + java.util.Map.Entry _input = (java.util.Map.Entry) $1; + return fromDomStatic((«QName.name»)_input.getKey(),_input.getValue()); } ''' ] ] - val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) + val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) as Class> + listener?.onDataContainerCodecCreated(inputType,ret); log.info("DOM Codec for {} was generated {}", inputType, ret) - return ret as Class>; + return ret; } catch (Exception e) { processException(inputType, e); return null; @@ -356,10 +379,11 @@ class TransformerGenerator { private def dispatch Class, Object>> generateTransformerFor( Class inputType, GeneratedType typeSpec, SchemaNode node) { try { + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); - staticQNameField(inputType); + staticQNameField(node.QName); staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) staticField(it, AUGMENTATION_CODEC, BindingCodec) implementsType(BINDING_CODEC) @@ -403,11 +427,12 @@ class TransformerGenerator { private def Class, Object>> generateAugmentationTransformerFor( Class inputType, GeneratedType type, AugmentationSchema node) { try { + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val properties = type.allProperties val ctCls = createClass(type.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); - staticQNameField(inputType); + staticQNameField(node.augmentationQName); staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) staticField(it, AUGMENTATION_CODEC, BindingCodec) implementsType(BINDING_CODEC) @@ -453,12 +478,15 @@ class TransformerGenerator { java.util.Map _compositeNode = (java.util.Map) $2; //System.out.println(_localQName + " " + _compositeNode); «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»); «ENDFOR» + if(_is_empty) { + return null; + } return _builder.build(); } ''' @@ -482,6 +510,7 @@ class TransformerGenerator { private def dispatch Class, Object>> generateTransformerFor( Class inputType, GeneratedType typeSpec, ChoiceNode node) { try { + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); @@ -537,7 +566,7 @@ class TransformerGenerator { val rawRet = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) val ret = rawRet as Class, Object>>; - listener?.onChoiceCodecCreated(inputType, ret); + listener?.onChoiceCodecCreated(inputType, ret, node); log.info("DOM Codec for {} was generated {}", inputType, ret) return ret; } catch (Exception e) { @@ -639,11 +668,13 @@ class TransformerGenerator { private def deserializeNodeContainerBodyImpl(GeneratedType type, HashMap properties, DataNodeContainer node) { val ret = ''' - «FOR child : node.childNodes.filter[!augmenting]» + 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»); + «IF signature !== null» + «deserializeProperty(child, signature.value, signature.key)» + _builder.«signature.key.toSetter»(«signature.key»); + «ENDIF» «ENDFOR» ''' return ret; @@ -658,7 +689,9 @@ class TransformerGenerator { //System.out.println("Aug. key:" + _entry.getKey()); Class _type = (Class) _entry.getKey(); «Augmentation.resolvedName» _value = («Augmentation.name») _entry.getValue(); - _builder.addAugmentation(_type,_value); + if(_value != null) { + _builder.addAugmentation(_type,_value); + } } } ''' @@ -675,6 +708,7 @@ class TransformerGenerator { boolean _hasNext = _iterator.hasNext(); while(_hasNext) { Object _listItem = _iterator.next(); + _is_empty = false; //System.out.println(" item" + _listItem); Object _value = «type.actualTypeArguments.get(0).serializer.resolvedName».fromDomStatic(_localQName,_listItem); //System.out.println(" value" + _value); @@ -696,6 +730,7 @@ class TransformerGenerator { java.util.Iterator _iterator = _dom_«propertyName».iterator(); boolean _hasNext = _iterator.hasNext(); while(_hasNext) { + _is_empty = false; Object _listItem = _iterator.next(); if(_listItem instanceof java.util.Map.Entry) { Object _innerValue = ((java.util.Map.Entry) _listItem).getValue(); @@ -712,6 +747,7 @@ class TransformerGenerator { _compositeNode.get(«QName.name».create(_localQName,"«schema.QName.localName»")); «type.resolvedName» «propertyName» = null; if(_dom_«propertyName»_list != null && _dom_«propertyName»_list.size() > 0) { + _is_empty = false; java.util.Map.Entry _dom_«propertyName» = (java.util.Map.Entry) _dom_«propertyName»_list.get(0); Object _inner_value = _dom_«propertyName».getValue(); «propertyName» = «deserializeValue(type, "_inner_value")»; @@ -724,7 +760,7 @@ class TransformerGenerator { _compositeNode.get(«QName.name».create(_localQName,"«schema.QName.localName»")); «type.resolvedName» «propertyName» = null; if(_dom_«propertyName»_list != null && _dom_«propertyName»_list.size() > 0) { - + _is_empty = false; java.util.Map _dom_«propertyName» = (java.util.Map) _dom_«propertyName»_list.get(0); «propertyName» = «type.serializer.resolvedName».fromDomStatic(_localQName,_dom_«propertyName»); } @@ -732,10 +768,17 @@ class TransformerGenerator { private def dispatch CharSequence deserializeProperty(ChoiceNode schema, Type type, String propertyName) ''' «type.resolvedName» «propertyName» = «type.serializer.resolvedName».fromDomStatic(_localQName,_compositeNode); + if(«propertyName» != null) { + _is_empty = false; + } ''' private def dispatch String deserializeValue(GeneratedTransferObject type, String domParameter) ''' - («type.resolvedName») «type.valueSerializer.resolvedName».fromDomValue(«domParameter»); + («type.resolvedName») «type.valueSerializer.resolvedName».fromDomValue(«domParameter») + ''' + + private def dispatch String deserializeValue(Enumeration type, String domParameter) ''' + («type.resolvedName») «type.valueSerializer.resolvedName».fromDomValue(«domParameter») ''' private def dispatch Class, Object>> generateValueTransformer( @@ -758,7 +801,7 @@ class TransformerGenerator { val hasYangBinding = hasBinding val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); - if(hasYangBinding) { + if (hasYangBinding) { implementsType(BINDING_CODEC) staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) implementsType(BindingDeserializer.asCtClass) @@ -865,22 +908,30 @@ class TransformerGenerator { return null; } - private def dispatch Class generateValueTransformer( - Class inputType, Enumeration typeSpec) { + private def dispatch Class generateValueTransformer(Class inputType, Enumeration typeSpec) { try { + val typeRef = new ReferencedTypeImpl(typeSpec.packageName, typeSpec.name); + val schema = typeToSchemaNode.get(typeRef) as ExtendedType; + val enumSchema = schema.baseType as EnumerationType; + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); //implementsType(BINDING_CODEC) - method(Object, "toDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC - body = ''' - if($1 == null) { + body = '''{ + if($1 == null) { + return null; + } + «typeSpec.resolvedName» _value = («typeSpec.resolvedName») $1; + «FOR en : enumSchema.values» + if(«typeSpec.resolvedName».«BindingGeneratorUtil.parseToClassName(en.name)».equals(_value)) { + return "«en.name»"; + } + «ENDFOR» return null; } - «typeSpec.resolvedName» _value = («typeSpec.resolvedName») $1; - return _value.getValue(); ''' ] method(Object, "serialize", Object) [ @@ -891,12 +942,18 @@ class TransformerGenerator { method(Object, "fromDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC body = ''' - if($1 == null) { + { + if($1 == null) { + return null; + } + String _value = (String) $1; + «FOR en : enumSchema.values» + if("«en.name»".equals(_value)) { + return «typeSpec.resolvedName».«BindingGeneratorUtil.parseToClassName(en.name)»; + } + «ENDFOR» return null; } - _simpleValue = null; - «typeSpec.resolvedName» _value = new «typeSpec.resolvedName»(null); - return _value; ''' ] method(Object, "deserialize", Object) [ @@ -981,12 +1038,6 @@ class TransformerGenerator { */ private def getBuilderName(GeneratedType type) '''«type.resolvedName»Builder''' - private def staticQNameField(CtClass it, Class node) { - val field = new CtField(ctQName, "QNAME", it); - field.modifiers = PUBLIC + FINAL + STATIC; - addField(field, '''«node.name».QNAME''') - } - private def staticQNameField(CtClass it, QName node) { val field = new CtField(ctQName, "QNAME", it); field.modifiers = PUBLIC + FINAL + STATIC; @@ -999,7 +1050,7 @@ class TransformerGenerator { «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, node)» «serializeAugmentations» return ($r) java.util.Collections.singletonMap(_resultName,_childNodes); } @@ -1010,7 +1061,7 @@ class TransformerGenerator { «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, node)» «serializeAugmentations» return ($r) java.util.Collections.singletonMap(_resultName,_childNodes); } @@ -1021,7 +1072,7 @@ class TransformerGenerator { «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, node)» «serializeAugmentations» return ($r) java.util.Collections.singletonMap(_resultName,_childNodes); } @@ -1036,18 +1087,20 @@ class TransformerGenerator { } ''' - private def transformDataContainerBody(Type type,Map properties, DataNodeContainer node) { + private def transformDataContainerBody(Type type, Map properties, DataNodeContainer node) { val ret = ''' - «FOR child : node.childNodes.filter[!augmenting]» - «var signature = properties.getFor(child)» - //System.out.println("«type.name»#«signature.key»" + value.«signature.key»()); - «serializeProperty(child, signature.value, signature.key)» + «FOR child : node.childNodes» + «val signature = properties.getFor(child)» + «IF signature !== null» + //System.out.println("«type.name»#«signature.key»" + value.«signature.key»()); + «serializeProperty(child, signature.value, signature.key)» + «ENDIF» «ENDFOR» ''' return ret; } - def serializeAugmentations() ''' + private def serializeAugmentations() ''' java.util.List _augmentations = (java.util.List) «AUGMENTATION_CODEC».serialize(value); if(_augmentations != null) { _childNodes.addAll(_augmentations); @@ -1055,12 +1108,15 @@ class TransformerGenerator { ''' def Entry getFor(Map map, DataSchemaNode node) { - val sig = map.get(node.getterName); - if (sig == null) { - + var sig = map.get(node.getterName); + if (sig != null) { + return new SimpleEntry(node.getterName, sig); + } + sig = map.get(node.booleanGetterName); + if (sig != null) { return new SimpleEntry(node.booleanGetterName, map.get(node.booleanGetterName)); } - return new SimpleEntry(node.getterName, sig); + return null; } private static def String getBooleanGetterName(DataSchemaNode node) { @@ -1078,6 +1134,7 @@ class TransformerGenerator { private def dispatch CharSequence serializeProperty(ListSchemaNode schema, ParameterizedType type, String propertyName) ''' «type.resolvedName» «propertyName» = value.«propertyName»(); + //System.out.println("«propertyName»:" + «propertyName»); if(«propertyName» != null) { java.util.Iterator _iterator = «propertyName».iterator(); boolean _hasNext = _iterator.hasNext(); @@ -1106,6 +1163,8 @@ class TransformerGenerator { private def dispatch serializeValue(GeneratedTransferObject type, String parameter) '''«type.valueSerializer. resolvedName».toDomValue(«parameter»)''' + private def dispatch serializeValue(Enumeration type, String parameter) '''«type.valueSerializer.resolvedName».toDomValue(«parameter»)''' + private def dispatch serializeValue(Type signature, String property) { if (INSTANCE_IDENTIFIER == signature) { return '''«INSTANCE_IDENTIFIER_CODEC».serialize(«property»)'''