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=0316614aa1269a93eb8d6aa3f7d2e3fd2a4438a7;hb=356f96ce57f8c099ce98e38b4053c075050bda10;hp=8e059aa22ed4e8ec1946afc18154b5fe9a38ded6;hpb=d6caaf86d29a8188ec2dce678315ef4417924e09;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 8e059aa22e..0316614aa1 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,12 @@ 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 +import static com.google.common.base.Preconditions.* +import org.opendaylight.yangtools.yang.model.api.SchemaPath class TransformerGenerator { @@ -74,6 +80,9 @@ class TransformerGenerator { @Property var Map typeToDefinition = new ConcurrentHashMap(); + @Property + var Map pathToType = new ConcurrentHashMap(); + @Property var Map typeToSchemaNode = new ConcurrentHashMap(); @@ -95,13 +104,36 @@ class TransformerGenerator { return withClassLoaderAndLock(inputType.classLoader, lock) [ | val ret = getGeneratedClass(inputType) if (ret !== null) { + listener.onClassProcessed(inputType); return ret as Class, Object>>; } val ref = Types.typeForClass(inputType) val node = typeToSchemaNode.get(ref) val typeSpecBuilder = typeToDefinition.get(ref) + checkState(typeSpecBuilder !== null, "Could not find typedefinition for %s", inputType.name); + val typeSpec = typeSpecBuilder.toInstance(); + val newret = generateTransformerFor(inputType, typeSpec, node); + listener.onClassProcessed(inputType); + return newret as Class, Object>>; + ] + } + + def Class, Object>> transformerFor(Class inputType, DataSchemaNode node) { + return withClassLoaderAndLock(inputType.classLoader, lock) [ | + val ret = getGeneratedClass(inputType) + if (ret !== null) { + listener.onClassProcessed(inputType); + return ret as Class, Object>>; + } + val ref = Types.typeForClass(inputType) + var typeSpecBuilder = typeToDefinition.get(ref) + if (typeSpecBuilder == null) { + typeSpecBuilder = pathToType.get(node.path); + } + checkState(typeSpecBuilder !== null, "Could not find TypeDefinition for %s, $s", inputType.name, node); val typeSpec = typeSpecBuilder.toInstance(); val newret = generateTransformerFor(inputType, typeSpec, node); + listener.onClassProcessed(inputType); return newret as Class, Object>>; ] } @@ -117,6 +149,7 @@ class TransformerGenerator { val typeSpecBuilder = typeToDefinition.get(ref) val typeSpec = typeSpecBuilder.toInstance(); val newret = generateAugmentationTransformerFor(inputType, typeSpec, node); + listener.onClassProcessed(inputType); return newret as Class, Object>>; ] } @@ -184,7 +217,7 @@ class TransformerGenerator { ] } - private def Class getGeneratedClass(Class cls) { + private def Class getGeneratedClass(Class cls) { try { return loadClassWithTCCL(cls.codecClassName) @@ -198,11 +231,9 @@ class TransformerGenerator { keyTransformerFor(cls, type, node); } - private def serializer(Type type) { + private def serializer(Type type, DataSchemaNode node) { val cls = loadClassWithTCCL(type.resolvedName); - - transformerFor(cls); - + transformerFor(cls, node); } private def Class getValueSerializer(GeneratedTransferObject type) { @@ -211,13 +242,29 @@ class TransformerGenerator { if (transformer !== null) { return transformer; } - val valueTransformer = generateValueTransformer(cls, type); - return valueTransformer; + 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; + ] } private def generateKeyTransformerFor(Class inputType, GeneratedType typeSpec, ListSchemaNode node) { try { - log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) + + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val properties = typeSpec.allProperties; val ctCls = createClass(inputType.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); @@ -235,7 +282,7 @@ class TransformerGenerator { _resultName = QNAME; } java.util.List _childNodes = new java.util.ArrayList(); - «inputType.name» value = («inputType.name») $2; + «inputType.resolvedName» value = («inputType.name») $2; «FOR key : node.keyDefinition» «val propertyName = key.getterName» «val keyDef = node.getDataChildByName(key)» @@ -255,13 +302,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.name» _value = new «inputType.name»(«node.keyDefinition.keyConstructorList»); + «inputType.resolvedName» _value = new «inputType.name»(«node.keyDefinition. + keyConstructorList»); return _value; } ''' @@ -291,14 +340,15 @@ class TransformerGenerator { } } - private def Class> generateCaseCodec(Class inputType, GeneratedType type, + private def Class> generateCaseCodec(Class inputType, GeneratedType type, ChoiceCaseNode node) { try { - log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) + + //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) [ @@ -308,7 +358,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.allProperties, node)» + «transformDataContainerBody(type, type.allProperties, node)» return ($r) _childNodes; } ''' @@ -332,16 +382,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; @@ -349,12 +401,13 @@ class TransformerGenerator { } private def dispatch Class, Object>> generateTransformerFor( - Class inputType, GeneratedType typeSpec, SchemaNode node) { + Class inputType, GeneratedType typeSpec, SchemaNode node) { try { - log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) + + //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) @@ -396,13 +449,14 @@ class TransformerGenerator { } private def Class, Object>> generateAugmentationTransformerFor( - Class inputType, GeneratedType type, AugmentationSchema node) { + Class inputType, GeneratedType type, AugmentationSchema node) { try { - log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) + + //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) @@ -446,14 +500,17 @@ class TransformerGenerator { return null; } java.util.Map _compositeNode = (java.util.Map) $2; - ////System.out.println(_localQName + " " + _compositeNode); + //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(); } ''' @@ -475,9 +532,10 @@ class TransformerGenerator { } private def dispatch Class, Object>> generateTransformerFor( - Class inputType, GeneratedType typeSpec, ChoiceNode node) { + Class inputType, GeneratedType typeSpec, ChoiceNode node) { try { - log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) + + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); //staticQNameField(inputType); @@ -500,7 +558,9 @@ class TransformerGenerator { return null; } java.util.Map.Entry _input = new «SimpleEntry.name»($1,_baValue); - return (java.util.List) _codec.serialize(_input); + Object _ret = _codec.serialize(_input); + //System.out.println("«typeSpec.name»#toDomStatic: " + _ret); + return («List.name») _ret; } ''' ] @@ -530,7 +590,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) { @@ -617,7 +677,7 @@ class TransformerGenerator { return null; } java.util.Map _compositeNode = (java.util.Map) $2; - ////System.out.println(_localQName + " " + _compositeNode); + //System.out.println(_localQName + " " + _compositeNode); «type.builderName» _builder = new «type.builderName»(); «deserializeDataNodeContainerBody(type, node)» «deserializeAugmentations» @@ -632,11 +692,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; @@ -651,7 +713,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); + } } } ''' @@ -660,7 +724,7 @@ class TransformerGenerator { String propertyName) ''' java.util.List _dom_«propertyName» = _compositeNode.get(«QName.name».create(_localQName,"«schema.QName. localName»")); - ////System.out.println("«propertyName»#deCode"+_dom_«propertyName»); + //System.out.println("«propertyName»#deCode"+_dom_«propertyName»); java.util.List «propertyName» = new java.util.ArrayList(); if(_dom_«propertyName» != null) { java.util.List _serialized = new java.util.ArrayList(); @@ -668,15 +732,16 @@ class TransformerGenerator { boolean _hasNext = _iterator.hasNext(); while(_hasNext) { Object _listItem = _iterator.next(); - ////System.out.println(" item" + _listItem); - Object _value = «type.actualTypeArguments.get(0).serializer.resolvedName».fromDomStatic(_localQName,_listItem); - ////System.out.println(" value" + _value); + _is_empty = false; + //System.out.println(" item" + _listItem); + Object _value = «type.actualTypeArguments.get(0).serializer(schema).resolvedName».fromDomStatic(_localQName,_listItem); + //System.out.println(" value" + _value); «propertyName».add(_value); _hasNext = _iterator.hasNext(); } } - ////System.out.println(" list" + «propertyName»); + //System.out.println(" list" + «propertyName»); ''' private def dispatch CharSequence deserializeProperty(LeafListSchemaNode schema, ParameterizedType type, @@ -689,6 +754,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(); @@ -705,6 +771,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")»; @@ -717,18 +784,25 @@ 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»); + «propertyName» = «type.serializer(schema).resolvedName».fromDomStatic(_localQName,_dom_«propertyName»); } ''' private def dispatch CharSequence deserializeProperty(ChoiceNode schema, Type type, String propertyName) ''' - «type.resolvedName» «propertyName» = «type.serializer.resolvedName».fromDomStatic(_localQName,_compositeNode); + «type.resolvedName» «propertyName» = «type.serializer(schema).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( @@ -737,29 +811,38 @@ class TransformerGenerator { val returnType = typeSpec.valueReturnType; if (returnType == null) { - val ctCls = createDummyImplementation(inputType, typeSpec); val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) return ret as Class, Object>>; } + var hasBinding = false; + try { + val bindingCodecClass = loadClassWithTCCL(BINDING_CODEC.name); + hasBinding = bindingCodecClass !== null; + } catch (ClassNotFoundException e) { + hasBinding = false; + } + val hasYangBinding = hasBinding val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); - implementsType(BINDING_CODEC) - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - implementsType(BindingDeserializer.asCtClass) + if (hasYangBinding) { + implementsType(BINDING_CODEC) + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) + implementsType(BindingDeserializer.asCtClass) + } method(Object, "toDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC body = ''' { - ////System.out.println("«inputType.simpleName»#toDomValue: "+$1); + //System.out.println("«inputType.simpleName»#toDomValue: "+$1); if($1 == null) { return null; } «typeSpec.resolvedName» _encapsulatedValue = («typeSpec.resolvedName») $1; - ////System.out.println("«inputType.simpleName»#toDomValue:Enc: "+_encapsulatedValue); + //System.out.println("«inputType.simpleName»#toDomValue:Enc: "+_encapsulatedValue); «returnType.resolvedName» _value = _encapsulatedValue.getValue(); - ////System.out.println("«inputType.simpleName»#toDomValue:DeEnc: "+_value); + //System.out.println("«inputType.simpleName»#toDomValue:DeEnc: "+_value); Object _domValue = «serializeValue(returnType, "_value")»; return _domValue; } @@ -776,7 +859,7 @@ class TransformerGenerator { modifiers = PUBLIC + FINAL + STATIC body = ''' { - ////System.out.println("«inputType.simpleName»#fromDomValue: "+$1); + //System.out.println("«inputType.simpleName»#fromDomValue: "+$1); if($1 == null) { return null; @@ -849,21 +932,30 @@ class TransformerGenerator { return null; } - private def dispatch Class, Object>> generateValueTransformer( - Class inputType, Enumeration typeSpec) { + private def dispatch Class generateValueTransformer(Class inputType, Enumeration typeSpec) { try { - log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) + 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) + //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) [ @@ -874,12 +966,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) [ @@ -891,7 +989,7 @@ class TransformerGenerator { val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) log.info("DOM Codec for {} was generated {}", inputType, ret) - return ret as Class, Object>>; + return ret; } catch (CodeGenerationException e) { throw new CodeGenerationException("Cannot compile Transformator for " + inputType, e); } catch (Exception e) { @@ -964,12 +1062,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; @@ -982,7 +1074,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.allProperties, node)» + «transformDataContainerBody(type, type.allProperties, node)» «serializeAugmentations» return ($r) java.util.Collections.singletonMap(_resultName,_childNodes); } @@ -993,7 +1085,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.allProperties, node)» + «transformDataContainerBody(type, type.allProperties, node)» «serializeAugmentations» return ($r) java.util.Collections.singletonMap(_resultName,_childNodes); } @@ -1004,7 +1096,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.allProperties, node)» + «transformDataContainerBody(type, type.allProperties, node)» «serializeAugmentations» return ($r) java.util.Collections.singletonMap(_resultName,_childNodes); } @@ -1019,18 +1111,20 @@ class TransformerGenerator { } ''' - private def transformDataContainerBody(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("«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); @@ -1038,12 +1132,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) { @@ -1061,12 +1158,13 @@ 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(); while(_hasNext) { Object _listItem = _iterator.next(); - Object _domValue = «type.actualTypeArguments.get(0).serializer.resolvedName».toDomStatic(_resultName,_listItem); + Object _domValue = «type.actualTypeArguments.get(0).serializer(schema).resolvedName».toDomStatic(_resultName,_listItem); _childNodes.add(_domValue); _hasNext = _iterator.hasNext(); } @@ -1089,6 +1187,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»)''' @@ -1117,7 +1217,7 @@ class TransformerGenerator { String propertyName) ''' «type.resolvedName» «propertyName» = value.«propertyName»(); if(«propertyName» != null) { - java.util.List domValue = «type.serializer.resolvedName».toDomStatic(_resultName,«propertyName»); + java.util.List domValue = «type.serializer(container).resolvedName».toDomStatic(_resultName,«propertyName»); _childNodes.addAll(domValue); } ''' @@ -1143,7 +1243,7 @@ class TransformerGenerator { String propertyName) ''' «type.resolvedName» «propertyName» = value.«propertyName»(); if(«propertyName» != null) { - Object domValue = «type.serializer.resolvedName».toDomStatic(_resultName,«propertyName»); + Object domValue = «type.serializer(container).resolvedName».toDomStatic(_resultName,«propertyName»); _childNodes.add(domValue); } ''' @@ -1152,11 +1252,11 @@ class TransformerGenerator { return '''«typeSpec.resolvedName»$Broker$Codec$DOM''' } - private def codecClassName(Class typeSpec) { + private def codecClassName(Class typeSpec) { return '''«typeSpec.name»$Broker$Codec$DOM''' } - private def dispatch HashMap getAllProperties(GeneratedType type) { + private def HashMap getAllProperties(GeneratedType type) { val ret = new HashMap(); type.collectAllProperties(ret); return ret; @@ -1186,12 +1286,11 @@ class TransformerGenerator { return type.asCtClass.name; } - def String getResolvedName(Class type) { + def String getResolvedName(Class type) { return type.asCtClass.name; } def CtClass asCtClass(Type type) { - val name = type.fullyQualifiedName val cls = loadClassWithTCCL(type.fullyQualifiedName) return cls.asCtClass; }