X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=code-generator%2Fbinding-generator-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fsal%2Fbinding%2Fgenerator%2Fimpl%2FTransformerGenerator.xtend;h=473c8e644c0749ad757c7f06b8578c3d4fd01fdc;hb=06452ecebb1998538c59a0a5ed47f47034045af5;hp=5d127d6c15cd2eaaf75b2e68fa47e82d4a83fd78;hpb=e2ab87f6b2330a78068f360f3c2c8578126cde11;p=yangtools.git diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/TransformerGenerator.xtend b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/TransformerGenerator.xtend index 5d127d6c15..473c8e644c 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/TransformerGenerator.xtend +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/TransformerGenerator.xtend @@ -29,8 +29,9 @@ import javassist.CtMethod import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil import org.opendaylight.yangtools.binding.generator.util.ReferencedTypeImpl import org.opendaylight.yangtools.binding.generator.util.Types -import org.opendaylight.yangtools.sal.binding.generator.util.ClassLoaderUtils import org.opendaylight.yangtools.sal.binding.generator.util.CodeGenerationException +import org.opendaylight.yangtools.sal.binding.generator.util.SourceCodeGenerator +import org.opendaylight.yangtools.sal.binding.generator.util.SourceCodeGeneratorFactory import org.opendaylight.yangtools.sal.binding.generator.util.XtendHelper import org.opendaylight.yangtools.sal.binding.model.api.Enumeration import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty @@ -39,11 +40,11 @@ import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType import org.opendaylight.yangtools.sal.binding.model.api.Type import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilder +import org.opendaylight.yangtools.util.ClassLoaderUtils import org.opendaylight.yangtools.yang.binding.Augmentation import org.opendaylight.yangtools.yang.binding.BindingCodec import org.opendaylight.yangtools.yang.binding.BindingDeserializer import org.opendaylight.yangtools.yang.binding.BindingMapping -import org.opendaylight.yangtools.yang.binding.DataObject import org.opendaylight.yangtools.yang.binding.InstanceIdentifier import org.opendaylight.yangtools.yang.common.QName import org.opendaylight.yangtools.yang.model.api.AugmentationSchema @@ -71,7 +72,6 @@ import static javassist.Modifier.* import static org.opendaylight.yangtools.sal.binding.generator.impl.CodecMapping.* import static extension org.opendaylight.yangtools.sal.binding.generator.util.YangSchemaUtils.* -import java.util.ArrayList class TransformerGenerator extends AbstractTransformerGenerator { private static val LOG = LoggerFactory.getLogger(TransformerGenerator) @@ -90,6 +90,8 @@ class TransformerGenerator extends AbstractTransformerGenerator { val CtClass BINDING_CODEC val CtClass ctQName + val SourceCodeGeneratorFactory sourceCodeGeneratorFactory = new SourceCodeGeneratorFactory(); + public new(TypeResolver typeResolver, ClassPool pool) { super(typeResolver, pool) @@ -328,17 +330,19 @@ class TransformerGenerator extends AbstractTransformerGenerator { private def generateKeyTransformerFor(Class inputType, GeneratedType typeSpec, ListSchemaNode node) { try { + val SourceCodeGenerator sourceGenerator = sourceCodeGeneratorFactory.getInstance( null ); + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val properties = typeSpec.allProperties; val ctCls = createClass(inputType.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - staticField(it, IDENTITYREF_CODEC, BindingCodec) - staticQNameField(node.QName); + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec, sourceGenerator) + staticField(it, IDENTITYREF_CODEC, BindingCodec, sourceGenerator) + staticQNameField(node.QName, sourceGenerator); implementsType(BINDING_CODEC) method(Object, "toDomStatic", #[QName, Object]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { «QName.name» _resultName; if($1 != null) { @@ -357,10 +361,11 @@ class TransformerGenerator extends AbstractTransformerGenerator { return ($r) java.util.Collections.singletonMap(_resultName,_childNodes); } ''' + setBodyChecked(body, sourceGenerator) ] method(Object, "fromDomStatic", #[QName, Object]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { if($2 == null){ return null; @@ -379,9 +384,10 @@ class TransformerGenerator extends AbstractTransformerGenerator { return _value; } ''' + setBodyChecked(body, sourceGenerator) ] method(Object, "serialize", Object) [ - bodyChecked = ''' + val body = ''' { java.util.Map.Entry _input = (java.util.Map.Entry) $1; «QName.name» _localQName = («QName.name») _input.getKey(); @@ -389,9 +395,10 @@ class TransformerGenerator extends AbstractTransformerGenerator { return toDomStatic(_localQName,_keyValue); } ''' + setBodyChecked(body, sourceGenerator) ] method(Object, "deserialize", Object) [ - bodyChecked = ''' + val body = ''' { «QName.name» _qname = QNAME; if($1 instanceof java.util.Map.Entry) { @@ -400,9 +407,11 @@ class TransformerGenerator extends AbstractTransformerGenerator { return fromDomStatic(_qname,$1); } ''' + setBodyChecked(body, sourceGenerator) ] ] val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) + sourceGenerator.outputGeneratedSource( ctCls ) LOG.debug("DOM Codec for {} was generated {}", inputType, ret) return ret as Class, ?>>; } catch (Exception e) { @@ -414,17 +423,19 @@ class TransformerGenerator extends AbstractTransformerGenerator { private def Class> generateCaseCodec(Class inputType, GeneratedType type, ChoiceCaseNode node) { try { + val SourceCodeGenerator sourceGenerator = sourceCodeGeneratorFactory.getInstance( null ); + //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(node.QName); - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - staticField(it, AUGMENTATION_CODEC, BindingCodec) - staticField(it, IDENTITYREF_CODEC, BindingCodec) + staticQNameField(node.QName, sourceGenerator); + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec, sourceGenerator) + staticField(it, AUGMENTATION_CODEC, BindingCodec, sourceGenerator) + staticField(it, IDENTITYREF_CODEC, BindingCodec, sourceGenerator) method(Object, "toDomStatic", #[QName, Object]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { «QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName()); java.util.List _childNodes = new java.util.ArrayList(); @@ -433,9 +444,10 @@ class TransformerGenerator extends AbstractTransformerGenerator { return ($r) _childNodes; } ''' + setBodyChecked( body, sourceGenerator) ] method(Object, "serialize", Object) [ - bodyChecked = ''' + val body = ''' { java.util.Map.Entry _input = (java.util.Map.Entry) $1; «QName.name» _localName = QNAME; @@ -445,23 +457,27 @@ class TransformerGenerator extends AbstractTransformerGenerator { return toDomStatic(_localName,_input.getValue()); } ''' + setBodyChecked( body, sourceGenerator) ] method(Object, "fromDomStatic", #[QName, Object, InstanceIdentifier]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = deserializeBody(type, node, getBindingIdentifierByPath(node.path)) + setBodyChecked( deserializeBody(type, node, getBindingIdentifierByPath(node.path)), + sourceGenerator ) ] method(Object, "deserialize", #[Object, InstanceIdentifier]) [ - bodyChecked = ''' + val body = ''' { //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(),$2); } ''' + setBodyChecked( body, sourceGenerator) ] ] val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) as Class> + sourceGenerator.outputGeneratedSource( ctCls ) listener?.onDataContainerCodecCreated(inputType, ret); LOG.debug("DOM Codec for {} was generated {}", inputType, ret) return ret; @@ -475,21 +491,24 @@ class TransformerGenerator extends AbstractTransformerGenerator { Class inputType, GeneratedType typeSpec, SchemaNode node) { try { + val SourceCodeGenerator sourceGenerator = sourceCodeGeneratorFactory.getInstance( null ); + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val ctCls = createClass(typeSpec.codecClassName) [ + //staticField(Map,"AUGMENTATION_SERIALIZERS"); - staticQNameField(node.QName); - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - staticField(it, IDENTITYREF_CODEC, BindingCodec) - staticField(it, AUGMENTATION_CODEC, BindingCodec) + staticQNameField(node.QName, sourceGenerator); + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec, sourceGenerator) + staticField(it, IDENTITYREF_CODEC, BindingCodec, sourceGenerator) + staticField(it, AUGMENTATION_CODEC, BindingCodec, sourceGenerator) implementsType(BINDING_CODEC) method(Object, "toDomStatic", #[QName, Object]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = serializeBodyFacade(typeSpec, node) + setBodyChecked( serializeBodyFacade(typeSpec, node), sourceGenerator ) ] method(Object, "serialize", Object) [ - bodyChecked = ''' + val body = ''' { java.util.Map.Entry _input = (java.util.Map.Entry) $1; «QName.name» _localName = QNAME; @@ -499,15 +518,17 @@ class TransformerGenerator extends AbstractTransformerGenerator { return toDomStatic(_localName,_input.getValue()); } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "fromDomStatic", #[QName, Object, InstanceIdentifier]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = deserializeBody(typeSpec, node, getBindingIdentifierByPath(node.path)) + setBodyChecked( deserializeBody(typeSpec, node, getBindingIdentifierByPath(node.path)), + sourceGenerator ) ] method(Object, "deserialize", #[Object, InstanceIdentifier]) [ - bodyChecked = ''' + val body = ''' { «QName.name» _qname = QNAME; if($1 instanceof java.util.Map.Entry) { @@ -516,10 +537,14 @@ class TransformerGenerator extends AbstractTransformerGenerator { return fromDomStatic(_qname,$1,$2); } ''' + setBodyChecked( body, sourceGenerator ) ] ] val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) as Class, Object>> + + sourceGenerator.outputGeneratedSource( ctCls ) + listener?.onDataContainerCodecCreated(inputType, ret); LOG.debug("DOM Codec for {} was generated {}", inputType, ret) return ret; @@ -533,19 +558,21 @@ class TransformerGenerator extends AbstractTransformerGenerator { Class inputType, GeneratedType type, AugmentationSchema node) { try { + val SourceCodeGenerator sourceGenerator = sourceCodeGeneratorFactory.getInstance( null ); + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val properties = type.allProperties val ctCls = createClass(type.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); - staticQNameField(node.augmentationQName); - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - staticField(it, AUGMENTATION_CODEC, BindingCodec) - staticField(it, IDENTITYREF_CODEC, BindingCodec) + staticQNameField(node.augmentationQName, sourceGenerator); + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec, sourceGenerator) + staticField(it, AUGMENTATION_CODEC, BindingCodec, sourceGenerator) + staticField(it, IDENTITYREF_CODEC, BindingCodec, sourceGenerator) implementsType(BINDING_CODEC) method(Object, "toDomStatic", #[QName, Object]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { ////System.out.println("Qname " + $1); ////System.out.println("Value " + $2); @@ -560,23 +587,25 @@ class TransformerGenerator extends AbstractTransformerGenerator { return ($r) _childNodes; } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "serialize", Object) [ - bodyChecked = ''' + val body = ''' { - java.util.Map.Entry _input = (java.util.Map.Entry) $1; - «QName.name» _localName = QNAME; - if(_input.getKey() != null) { - _localName = («QName.name») _input.getKey(); - } - return toDomStatic(_localName,_input.getValue()); + java.util.Map.Entry _input = (java.util.Map.Entry) $1; + «QName.name» _localName = QNAME; + if(_input.getKey() != null) { + _localName = («QName.name») _input.getKey(); + } + return toDomStatic(_localName,_input.getValue()); } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "fromDomStatic", #[QName, Object, InstanceIdentifier]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { «QName.name» _localQName = QNAME; @@ -598,16 +627,21 @@ class TransformerGenerator extends AbstractTransformerGenerator { return _builder.build(); } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "deserialize", #[Object, InstanceIdentifier]) [ - bodyChecked = ''' - return fromDomStatic(QNAME,$1,$2); + val body = ''' + { + return fromDomStatic(QNAME,$1,$2); + } ''' + setBodyChecked( body, sourceGenerator ) ] ] val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) as Class, Object>> + sourceGenerator.outputGeneratedSource( ctCls ) listener?.onDataContainerCodecCreated(inputType, ret); return ret; } catch (Exception e) { @@ -620,18 +654,20 @@ class TransformerGenerator extends AbstractTransformerGenerator { Class inputType, GeneratedType typeSpec, ChoiceNode node) { try { + val SourceCodeGenerator sourceGenerator = sourceCodeGeneratorFactory.getInstance( null ); + //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); //staticQNameField(inputType); - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - staticField(it, IDENTITYREF_CODEC, BindingCodec) - staticField(it, DISPATCH_CODEC, BindingCodec) + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec, sourceGenerator) + staticField(it, IDENTITYREF_CODEC, BindingCodec, sourceGenerator) + staticField(it, DISPATCH_CODEC, BindingCodec, sourceGenerator) //staticField(it,QNAME_TO_CASE_MAP,BindingCodec) implementsType(BINDING_CODEC) method(List, "toDomStatic", #[QName, Object]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { if($2 == null) { return null; @@ -645,15 +681,19 @@ class TransformerGenerator extends AbstractTransformerGenerator { return («List.name») _ret; } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "serialize", Object) [ - bodyChecked = ''' - throw new «UnsupportedOperationException.name»("Direct invocation not supported."); + val body = ''' + { + throw new «UnsupportedOperationException.name»("Direct invocation not supported."); + } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "fromDomStatic", #[QName, Map, InstanceIdentifier]) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { if («DISPATCH_CODEC» == null) { throw new «IllegalStateException.name»("Implementation of codec was not initialized."); @@ -661,15 +701,20 @@ class TransformerGenerator extends AbstractTransformerGenerator { return «DISPATCH_CODEC».deserialize($2,$3); } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "deserialize", #[Object, InstanceIdentifier]) [ - bodyChecked = ''' - throw new «UnsupportedOperationException.name»("Direct invocation not supported."); + val body = ''' + { + throw new «UnsupportedOperationException.name»("Direct invocation not supported."); + } ''' + setBodyChecked( body, sourceGenerator ) ] ] val rawRet = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) + sourceGenerator.outputGeneratedSource( ctCls ) val ret = rawRet as Class, Object>>; listener?.onChoiceCodecCreated(inputType, ret, node); LOG.debug("DOM Codec for {} was generated {}", inputType, ret) @@ -908,10 +953,13 @@ class TransformerGenerator extends AbstractTransformerGenerator { Class inputType, GeneratedTransferObject typeSpec, TypeDefinition typeDef) { try { + val SourceCodeGenerator sourceGenerator = sourceCodeGeneratorFactory.getInstance( null ); + val returnType = typeSpec.valueReturnType; if (returnType == null) { - val ctCls = createDummyImplementation(inputType, typeSpec); + val ctCls = createDummyImplementation(inputType, typeSpec, sourceGenerator); val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) + sourceGenerator.outputGeneratedSource( ctCls ) return ret as Class, Object>>; } @@ -919,14 +967,14 @@ class TransformerGenerator extends AbstractTransformerGenerator { //staticField(Map,"AUGMENTATION_SERIALIZERS"); if (inputType.isYangBindingAvailable) { implementsType(BINDING_CODEC) - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - staticField(it, IDENTITYREF_CODEC, BindingCodec) + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec, sourceGenerator) + staticField(it, IDENTITYREF_CODEC, BindingCodec, sourceGenerator) implementsType(BindingDeserializer.asCtClass) } method(Object, "toDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC val ctSpec = typeSpec.asCtClass; - bodyChecked = ''' + val body = ''' { ////System.out.println("«inputType.simpleName»#toDomValue: "+$1); @@ -941,17 +989,19 @@ class TransformerGenerator extends AbstractTransformerGenerator { return _domValue; } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "serialize", Object) [ - bodyChecked = ''' + val body = ''' { return toDomValue($1); } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "fromDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { ////System.out.println("«inputType.simpleName»#fromDomValue: "+$1); @@ -963,16 +1013,20 @@ class TransformerGenerator extends AbstractTransformerGenerator { return _value; } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "deserialize", Object) [ - bodyChecked = '''{ + val body = ''' + { return fromDomValue($1); - } + } ''' + setBodyChecked( body, sourceGenerator ) ] ] val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) + sourceGenerator.outputGeneratedSource( ctCls ) LOG.debug("DOM Codec for {} was generated {}", inputType, ret) return ret as Class, Object>>; } catch (Exception e) { @@ -986,20 +1040,22 @@ class TransformerGenerator extends AbstractTransformerGenerator { private def dispatch Class, Object>> generateValueTransformer( Class inputType, GeneratedTransferObject typeSpec, UnionTypeDefinition typeDef) { try { + val SourceCodeGenerator sourceGenerator = sourceCodeGeneratorFactory.getInstance( null ); + val ctCls = createClass(typeSpec.codecClassName) [ val properties = typeSpec.allProperties; val getterToTypeDefinition = XtendHelper.getTypes(typeDef).toMap[type|type.QName.getterName]; //staticField(Map,"AUGMENTATION_SERIALIZERS"); if (inputType.isYangBindingAvailable) { implementsType(BINDING_CODEC) - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - staticField(it, IDENTITYREF_CODEC, BindingCodec) + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec, sourceGenerator) + staticField(it, IDENTITYREF_CODEC, BindingCodec, sourceGenerator) implementsType(BindingDeserializer.asCtClass) } method(Object, "toDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC val ctSpec = inputType.asCtClass; - bodyChecked = ''' + val body = ''' { ////System.out.println("«inputType.simpleName»#toDomValue: "+$1); @@ -1021,17 +1077,19 @@ class TransformerGenerator extends AbstractTransformerGenerator { return null; } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "serialize", Object) [ - bodyChecked = ''' + val body = ''' { return toDomValue($1); } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "fromDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { ////System.out.println("«inputType.simpleName»#fromDomValue: "+$1); @@ -1045,16 +1103,20 @@ class TransformerGenerator extends AbstractTransformerGenerator { return null; } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "deserialize", Object) [ - bodyChecked = '''{ + val body = ''' + { return fromDomValue($1); - } + } ''' + setBodyChecked( body, sourceGenerator ) ] ] val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) + sourceGenerator.outputGeneratedSource( ctCls ) LOG.debug("DOM Codec for {} was generated {}", inputType, ret) return ret as Class, Object>>; } catch (Exception e) { @@ -1068,18 +1130,20 @@ class TransformerGenerator extends AbstractTransformerGenerator { private def dispatch Class, Object>> generateValueTransformer( Class inputType, GeneratedTransferObject typeSpec, BitsTypeDefinition typeDef) { try { + val SourceCodeGenerator sourceGenerator = sourceCodeGeneratorFactory.getInstance( null ); + val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); if (inputType.isYangBindingAvailable) { implementsType(BINDING_CODEC) - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - staticField(it, IDENTITYREF_CODEC, BindingCodec) + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec, sourceGenerator) + staticField(it, IDENTITYREF_CODEC, BindingCodec, sourceGenerator) implementsType(BindingDeserializer.asCtClass) } method(Object, "toDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC val ctSpec = typeSpec.asCtClass; - bodyChecked = ''' + val body = ''' { ////System.out.println("«inputType.simpleName»#toDomValue: "+$1); @@ -1102,21 +1166,20 @@ class TransformerGenerator extends AbstractTransformerGenerator { return _domValue; } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "serialize", Object) [ - bodyChecked = ''' + val body = ''' { return toDomValue($1); } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "fromDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC - val sortedBits = new ArrayList(typeDef.bits) - Collections.sort(sortedBits, [o1, o2| - o1.propertyName.compareTo(o2.propertyName) - ]) - bodyChecked = ''' + val sortedBits = typeDef.bits.sort[o1, o2|o1.propertyName.compareTo(o2.propertyName)] + val body = ''' { //System.out.println("«inputType.simpleName»#fromDomValue: "+$1); @@ -1131,16 +1194,20 @@ class TransformerGenerator extends AbstractTransformerGenerator { return new «inputType.resolvedName»(«FOR bit : sortedBits SEPARATOR ","»«bit.propertyName»«ENDFOR»); } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "deserialize", Object) [ - bodyChecked = '''{ + val body = ''' + { return fromDomValue($1); - } + } ''' + setBodyChecked( body, sourceGenerator ) ] ] val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) + sourceGenerator.outputGeneratedSource( ctCls ) LOG.debug("DOM Codec for {} was generated {}", inputType, ret) return ret as Class, Object>>; } catch (Exception e) { @@ -1170,42 +1237,48 @@ class TransformerGenerator extends AbstractTransformerGenerator { } } - private def createDummyImplementation(Class object, GeneratedTransferObject typeSpec) { + private def createDummyImplementation(Class object, GeneratedTransferObject typeSpec, + SourceCodeGenerator sourceGenerator ) { LOG.trace("Generating Dummy DOM Codec for {} with {}", object, object.classLoader) return createClass(typeSpec.codecClassName) [ if (object.isYangBindingAvailable) { implementsType(BINDING_CODEC) - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - staticField(it, IDENTITYREF_CODEC, BindingCodec) + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec, sourceGenerator) + staticField(it, IDENTITYREF_CODEC, BindingCodec, sourceGenerator) implementsType(BindingDeserializer.asCtClass) } //implementsType(BindingDeserializer.asCtClass) method(Object, "toDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = '''{ - if($1 == null) { - return null; - } - return $1.toString(); - + val body = ''' + { + if($1 == null) { + return null; + } + return $1.toString(); }''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "serialize", Object) [ - bodyChecked = ''' + val body = ''' { return toDomValue($1); } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "fromDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = '''return null;''' + val body = '''return null;''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "deserialize", Object) [ - bodyChecked = '''{ + val body = ''' + { return fromDomValue($1); } ''' + setBodyChecked( body, sourceGenerator ) ] ] } @@ -1233,13 +1306,16 @@ class TransformerGenerator extends AbstractTransformerGenerator { } val enumSchema = enumSchemaType; try { + val SourceCodeGenerator sourceGenerator = sourceCodeGeneratorFactory.getInstance( null ); + //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 - bodyChecked = '''{ + val body = ''' + { if($1 == null) { return null; } @@ -1252,15 +1328,19 @@ class TransformerGenerator extends AbstractTransformerGenerator { return null; } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "serialize", Object) [ - bodyChecked = ''' - return toDomValue($1); + val body = ''' + { + return toDomValue($1); + } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "fromDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC - bodyChecked = ''' + val body = ''' { if($1 == null) { return null; @@ -1274,15 +1354,20 @@ class TransformerGenerator extends AbstractTransformerGenerator { return null; } ''' + setBodyChecked( body, sourceGenerator ) ] method(Object, "deserialize", Object) [ - bodyChecked = ''' - return fromDomValue($1); + val body = ''' + { + return fromDomValue($1); + } ''' + setBodyChecked( body, sourceGenerator ) ] ] val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) + sourceGenerator.outputGeneratedSource( ctCls ) LOG.debug("DOM Codec for {} was generated {}", inputType, ret) return ret; } catch (CodeGenerationException e) { @@ -1347,11 +1432,13 @@ class TransformerGenerator extends AbstractTransformerGenerator { */ private def getBuilderName(GeneratedType type) '''«type.resolvedName»Builder''' - private def staticQNameField(CtClass it, QName node) { + private def staticQNameField(CtClass it, QName node, SourceCodeGenerator sourceGenerator) { val field = new CtField(ctQName, "QNAME", it); field.modifiers = PUBLIC + FINAL + STATIC; - addField(field, - '''«QName.asCtClass.name».create("«node.namespace»","«node.formattedRevision»","«node.localName»")''') + val code = '''«QName.asCtClass.name».create("«node.namespace»","«node.formattedRevision»","«node.localName»")''' + addField(field, code ) + + sourceGenerator.appendField( field, code ); } private def String serializeBodyImpl(GeneratedType type, DataNodeContainer nodeContainer) ''' @@ -1605,9 +1692,11 @@ class TransformerGenerator extends AbstractTransformerGenerator { throw exception; } - private def setBodyChecked(CtMethod method, String body) { + private def setBodyChecked(CtMethod method, String body, SourceCodeGenerator sourceGenerator ) { try { method.setBody(body); + + sourceGenerator.appendMethod( method, body ); } catch (CannotCompileException e) { LOG.error("Cannot compile method: {}#{} {}, Reason: {} Body: {}", method.declaringClass, method.name, method.signature, e.message, body)