1 package org.opendaylight.controller.sal.binding.dom.serializer.impl
3 import javassist.ClassPool
4 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType
5 import org.opendaylight.yangtools.yang.model.api.SchemaNode
6 import org.opendaylight.controller.sal.binding.codegen.util.JavassistUtils
7 import javassist.CtClass
9 import org.opendaylight.yangtools.yang.common.QName
10 import javassist.CtField
11 import static javassist.Modifier.*
12 import static org.opendaylight.controller.sal.binding.dom.serializer.impl.CodecMapping.*
13 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode
14 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode
15 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer
16 import org.opendaylight.yangtools.sal.binding.model.api.Type
17 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilder
18 import org.opendaylight.yangtools.binding.generator.util.Types
19 import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType
20 import java.util.HashMap
21 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode
22 import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil
23 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode
24 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode
26 import java.util.TreeSet
27 import com.google.common.base.Joiner
28 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject
29 import org.opendaylight.yangtools.sal.binding.model.api.Enumeration
30 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode
31 import static org.opendaylight.controller.sal.binding.impl.util.ClassLoaderUtils.*;
32 import org.opendaylight.yangtools.yang.binding.BindingDeserializer
33 import org.opendaylight.yangtools.yang.binding.BindingCodec
34 import org.slf4j.LoggerFactory
35 import org.opendaylight.controller.sal.binding.codegen.CodeGenerationException
36 import org.opendaylight.yangtools.yang.model.api.ChoiceNode
37 import java.security.ProtectionDomain
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
40 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty
41 import java.util.Map.Entry
42 import java.util.AbstractMap.SimpleEntry
43 import org.opendaylight.yangtools.yang.binding.DataObject
44 import org.opendaylight.yangtools.yang.binding.Augmentation
45 import java.util.Iterator
46 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema
47 import java.util.concurrent.ConcurrentHashMap
48 import static extension org.opendaylight.controller.sal.binding.impl.util.YangSchemaUtils.*;
49 import org.opendaylight.yangtools.binding.generator.util.ReferencedTypeImpl
50 import org.opendaylight.yangtools.yang.model.util.ExtendedType
51 import org.opendaylight.yangtools.yang.model.util.EnumerationType
52 import static com.google.common.base.Preconditions.*
53 import org.opendaylight.yangtools.yang.model.api.SchemaPath
54 import javassist.CtMethod
55 import javassist.CannotCompileException
56 import java.util.concurrent.locks.Lock
57 import java.util.concurrent.Callable
58 import org.opendaylight.controller.sal.binding.impl.util.ClassLoaderUtils
60 class TransformerGenerator {
62 private static val log = LoggerFactory.getLogger(TransformerGenerator)
64 public static val STRING = Types.typeForClass(String);
65 public static val BOOLEAN = Types.typeForClass(Boolean);
66 public static val INTEGER = Types.typeForClass(Integer);
67 public static val INSTANCE_IDENTIFIER = Types.typeForClass(InstanceIdentifier)
69 //public static val DECIMAL = Types.typeForClass(Decimal);
70 public static val LONG = Types.typeForClass(Long);
72 val ClassPool classPool
73 val extension JavassistUtils utils;
80 var File classFileCapturePath;
83 var Map<Type, Type> typeDefinitions = new ConcurrentHashMap();
86 var Map<Type, GeneratedTypeBuilder> typeToDefinition = new ConcurrentHashMap();
89 var Map<SchemaPath, GeneratedTypeBuilder> pathToType = new ConcurrentHashMap();
92 var Map<Type, SchemaNode> typeToSchemaNode = new ConcurrentHashMap();
95 var Map<Type, AugmentationSchema> typeToAugmentation = new ConcurrentHashMap();
98 var GeneratorListener listener;
100 public static val CLASS_TYPE = Types.typeForClass(Class);
102 public new(ClassPool pool) {
104 utils = new JavassistUtils(pool)
106 BINDING_CODEC = BindingCodec.asCtClass;
107 ctQName = QName.asCtClass
110 def Class<? extends BindingCodec<Map<QName, Object>, Object>> transformerFor(Class<?> inputType) {
111 return withClassLoaderAndLock(inputType.classLoader, lock) [ |
112 val ret = getGeneratedClass(inputType)
114 listener.onClassProcessed(inputType);
115 return ret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
117 val ref = Types.typeForClass(inputType)
118 val node = typeToSchemaNode.get(ref)
119 val typeSpecBuilder = typeToDefinition.get(ref)
120 checkState(typeSpecBuilder !== null, "Could not find typedefinition for %s", inputType.name);
121 val typeSpec = typeSpecBuilder.toInstance();
122 val newret = generateTransformerFor(inputType, typeSpec, node);
123 listener.onClassProcessed(inputType);
124 return newret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
128 def Class<? extends BindingCodec<Map<QName, Object>, Object>> transformerFor(Class<?> inputType, DataSchemaNode node) {
129 return withClassLoaderAndLock(inputType.classLoader, lock) [ |
130 val ret = getGeneratedClass(inputType)
132 listener.onClassProcessed(inputType);
133 return ret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
135 val ref = Types.typeForClass(inputType)
136 var typeSpecBuilder = typeToDefinition.get(ref)
137 if (typeSpecBuilder == null) {
138 typeSpecBuilder = pathToType.get(node.path);
140 checkState(typeSpecBuilder !== null, "Could not find TypeDefinition for %s, $s", inputType.name, node);
141 val typeSpec = typeSpecBuilder.toInstance();
142 val newret = generateTransformerFor(inputType, typeSpec, node);
143 listener.onClassProcessed(inputType);
144 return newret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
148 def Class<? extends BindingCodec<Map<QName, Object>, Object>> augmentationTransformerFor(Class<?> inputType) {
149 return withClassLoaderAndLock(inputType.classLoader, lock) [ |
150 val ret = getGeneratedClass(inputType)
152 return ret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
154 val ref = Types.typeForClass(inputType)
155 val node = typeToAugmentation.get(ref)
156 val typeSpecBuilder = typeToDefinition.get(ref)
157 val typeSpec = typeSpecBuilder.toInstance();
158 val newret = generateAugmentationTransformerFor(inputType, typeSpec, node);
159 listener.onClassProcessed(inputType);
160 return newret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
164 def Class<? extends BindingCodec<Object, Object>> caseCodecFor(Class<?> inputType, ChoiceCaseNode node) {
165 return withClassLoaderAndLock(inputType.classLoader, lock) [ |
166 val ret = getGeneratedClass(inputType)
168 return ret as Class<? extends BindingCodec<Object, Object>>;
170 val ref = Types.typeForClass(inputType)
171 val typeSpecBuilder = typeToDefinition.get(ref)
172 val typeSpec = typeSpecBuilder.toInstance();
173 val newret = generateCaseCodec(inputType, typeSpec, node);
174 return newret as Class<? extends BindingCodec<Object, Object>>;
178 def Class<? extends BindingCodec<Map<QName, Object>, Object>> keyTransformerForIdentifiable(Class<?> parentType) {
179 return withClassLoaderAndLock(parentType.classLoader, lock) [ |
180 val inputName = parentType.name + "Key";
181 val inputType = loadClassWithTCCL(inputName);
182 val ret = getGeneratedClass(inputType)
184 return ret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
186 val ref = Types.typeForClass(parentType)
187 val node = typeToSchemaNode.get(ref) as ListSchemaNode
188 val typeSpecBuilder = typeToDefinition.get(ref)
189 val typeSpec = typeSpecBuilder.identifierDefinition;
190 val newret = generateKeyTransformerFor(inputType, typeSpec, node);
191 return newret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
195 def getIdentifierDefinition(GeneratedTypeBuilder builder) {
196 val inst = builder.toInstance
197 val keyMethod = inst.methodDefinitions.findFirst[name == "getKey"]
198 return keyMethod.returnType as GeneratedTransferObject
201 def Class<? extends BindingCodec<Map<QName, Object>, Object>> keyTransformerForIdentifier(Class<?> inputType) {
202 return withClassLoaderAndLock(inputType.classLoader, lock) [ |
203 val ret = getGeneratedClass(inputType)
205 return ret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
207 val ref = Types.typeForClass(inputType)
208 val node = typeToSchemaNode.get(ref) as ListSchemaNode
209 val typeSpecBuilder = typeToDefinition.get(ref)
210 val typeSpec = typeSpecBuilder.toInstance();
211 val newret = generateKeyTransformerFor(inputType, typeSpec, node);
212 return newret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
216 private def Class<?> keyTransformerFor(Class<?> inputType, GeneratedType type, ListSchemaNode schema) {
217 return withClassLoaderAndLock(inputType.classLoader, lock) [ |
218 val transformer = getGeneratedClass(inputType)
219 if (transformer != null) {
222 val newret = generateKeyTransformerFor(inputType, type, schema);
223 return newret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
227 private def Class<?> getGeneratedClass(Class<? extends Object> cls) {
230 return loadClassWithTCCL(cls.codecClassName)
231 } catch (ClassNotFoundException e) {
236 private def Class<?> keyTransformer(GeneratedType type, ListSchemaNode node) {
237 val cls = loadClassWithTCCL(type.resolvedName + "Key");
238 keyTransformerFor(cls, type, node);
241 private def serializer(Type type, DataSchemaNode node) {
242 val cls = loadClassWithTCCL(type.resolvedName);
243 transformerFor(cls, node);
246 private def Class<?> getValueSerializer(GeneratedTransferObject type) {
247 val cls = loadClassWithTCCL(type.resolvedName);
248 val transformer = cls.generatedClass;
249 if (transformer !== null) {
252 return withClassLoaderAndLock(cls.classLoader, lock) [ |
253 val valueTransformer = generateValueTransformer(cls, type);
254 return valueTransformer;
258 private def Class<?> getValueSerializer(Enumeration type) {
259 val cls = loadClassWithTCCL(type.resolvedName);
260 val transformer = cls.generatedClass;
261 if (transformer !== null) {
265 return withClassLoaderAndLock(cls.classLoader, lock) [ |
266 val valueTransformer = generateValueTransformer(cls, type);
267 return valueTransformer;
271 private def generateKeyTransformerFor(Class<? extends Object> inputType, GeneratedType typeSpec, ListSchemaNode node) {
274 //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
275 val properties = typeSpec.allProperties;
276 val ctCls = createClass(inputType.codecClassName) [
277 //staticField(Map,"AUGMENTATION_SERIALIZERS");
278 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
279 staticField(it, IDENTITYREF_CODEC, BindingCodec)
280 staticQNameField(node.QName);
281 implementsType(BINDING_CODEC)
282 method(Object, "toDomStatic", QName, Object) [
283 modifiers = PUBLIC + FINAL + STATIC
286 «QName.name» _resultName;
288 _resultName = «QName.name».create($1,QNAME.getLocalName());
292 java.util.List _childNodes = new java.util.ArrayList();
293 «inputType.resolvedName» value = («inputType.name») $2;
294 «FOR key : node.keyDefinition»
295 «val propertyName = key.getterName»
296 «val keyDef = node.getDataChildByName(key)»
297 «val property = properties.get(propertyName)»
298 «serializeProperty(keyDef, property, propertyName)»;
300 return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
304 method(Object, "fromDomStatic", QName, Object) [
305 modifiers = PUBLIC + FINAL + STATIC
311 «QName.name» _localQName = $1;
312 java.util.Map _compositeNode = (java.util.Map) $2;
313 boolean _is_empty = true;
314 «FOR key : node.keyDefinition»
315 «val propertyName = key.getterName»
316 «val keyDef = node.getDataChildByName(key)»
317 «val property = properties.get(propertyName)»
318 «deserializeProperty(keyDef, property, propertyName)»;
320 «inputType.resolvedName» _value = new «inputType.name»(«node.keyDefinition.
321 keyConstructorList»);
326 method(Object, "serialize", Object) [
329 java.util.Map.Entry _input = (java.util.Map.Entry) $1;
330 «QName.name» _localQName = («QName.name») _input.getKey();
331 «inputType.name» _keyValue = («inputType.name») _input.getValue();
332 return toDomStatic(_localQName,_keyValue);
336 method(Object, "deserialize", Object) [
338 return fromDomStatic(QNAME,$1);
342 val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain)
343 log.info("DOM Codec for {} was generated {}", inputType, ret)
344 return ret as Class<? extends BindingCodec<Map<QName,Object>, ?>>;
345 } catch (Exception e) {
346 processException(inputType, e);
351 private def Class<? extends BindingCodec<Object, Object>> generateCaseCodec(Class<?> inputType, GeneratedType type,
352 ChoiceCaseNode node) {
355 //log.info("Generating DOM Codec for {} with {}, TCCL is: {}", inputType, inputType.classLoader,Thread.currentThread.contextClassLoader)
356 val ctCls = createClass(type.codecClassName) [
357 //staticField(Map,"AUGMENTATION_SERIALIZERS");
358 implementsType(BINDING_CODEC)
359 staticQNameField(node.QName);
360 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
361 staticField(it, AUGMENTATION_CODEC, BindingCodec)
362 staticField(it, IDENTITYREF_CODEC, BindingCodec)
363 method(Object, "toDomStatic", QName, Object) [
364 modifiers = PUBLIC + FINAL + STATIC
367 «QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
368 java.util.List _childNodes = new java.util.ArrayList();
369 «type.resolvedName» value = («type.resolvedName») $2;
370 «transformDataContainerBody(type, type.allProperties, node)»
371 return ($r) _childNodes;
375 method(Object, "serialize", Object) [
378 java.util.Map.Entry _input = (java.util.Map.Entry) $1;
379 «QName.name» _localName = QNAME;
380 if(_input.getKey() != null) {
381 _localName = («QName.name») _input.getKey();
383 return toDomStatic(_localName,_input.getValue());
387 method(Object, "fromDomStatic", QName, Object) [
388 modifiers = PUBLIC + FINAL + STATIC
389 bodyChecked = deserializeBody(type, node)
391 method(Object, "deserialize", Object) [
394 //System.out.println("«type.name»#deserialize: " +$1);
395 java.util.Map.Entry _input = (java.util.Map.Entry) $1;
396 return fromDomStatic((«QName.name»)_input.getKey(),_input.getValue());
402 val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) as Class<? extends BindingCodec<Object, Object>>
403 listener?.onDataContainerCodecCreated(inputType, ret);
404 log.info("DOM Codec for {} was generated {}", inputType, ret)
406 } catch (Exception e) {
407 processException(inputType, e);
412 private def dispatch Class<? extends BindingCodec<Map<QName, Object>, Object>> generateTransformerFor(
413 Class<?> inputType, GeneratedType typeSpec, SchemaNode node) {
416 //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
417 val ctCls = createClass(typeSpec.codecClassName) [
418 //staticField(Map,"AUGMENTATION_SERIALIZERS");
419 staticQNameField(node.QName);
420 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
421 staticField(it, IDENTITYREF_CODEC, BindingCodec)
422 staticField(it, AUGMENTATION_CODEC, BindingCodec)
423 implementsType(BINDING_CODEC)
424 method(Object, "toDomStatic", QName, Object) [
425 modifiers = PUBLIC + FINAL + STATIC
426 bodyChecked = serializeBodyFacade(typeSpec, node)
428 method(Object, "serialize", Object) [
431 java.util.Map.Entry _input = (java.util.Map.Entry) $1;
432 «QName.name» _localName = QNAME;
433 if(_input.getKey() != null) {
434 _localName = («QName.name») _input.getKey();
436 return toDomStatic(_localName,_input.getValue());
440 method(Object, "fromDomStatic", QName, Object) [
441 modifiers = PUBLIC + FINAL + STATIC
442 bodyChecked = deserializeBody(typeSpec, node)
444 method(Object, "deserialize", Object) [
446 return fromDomStatic(QNAME,$1);
451 val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) as Class<? extends BindingCodec<Map<QName,Object>, Object>>
452 listener?.onDataContainerCodecCreated(inputType, ret);
453 log.info("DOM Codec for {} was generated {}", inputType, ret)
455 } catch (Exception e) {
456 processException(inputType, e);
461 private def Class<? extends BindingCodec<Map<QName, Object>, Object>> generateAugmentationTransformerFor(
462 Class<?> inputType, GeneratedType type, AugmentationSchema node) {
465 //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
466 val properties = type.allProperties
467 val ctCls = createClass(type.codecClassName) [
468 //staticField(Map,"AUGMENTATION_SERIALIZERS");
469 staticQNameField(node.augmentationQName);
470 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
471 staticField(it, AUGMENTATION_CODEC, BindingCodec)
472 staticField(it, IDENTITYREF_CODEC, BindingCodec)
473 implementsType(BINDING_CODEC)
474 method(Object, "toDomStatic", QName, Object) [
475 modifiers = PUBLIC + FINAL + STATIC
478 //System.out.println("Qname " + $1);
479 //System.out.println("Value " + $2);
480 «QName.name» _resultName = «QName.name».create(QNAME,QNAME.getLocalName());
481 java.util.List _childNodes = new java.util.ArrayList();
482 «type.resolvedName» value = («type.resolvedName») $2;
483 «FOR child : node.childNodes»
484 «var signature = properties.getFor(child)»
485 //System.out.println("«signature.key»" + value.«signature.key»());
486 «serializeProperty(child, signature.value, signature.key)»
488 return ($r) _childNodes;
492 method(Object, "serialize", Object) [
495 java.util.Map.Entry _input = (java.util.Map.Entry) $1;
496 «QName.name» _localName = QNAME;
497 if(_input.getKey() != null) {
498 _localName = («QName.name») _input.getKey();
500 return toDomStatic(_localName,_input.getValue());
504 method(Object, "fromDomStatic", QName, Object) [
505 modifiers = PUBLIC + FINAL + STATIC
508 «QName.name» _localQName = QNAME;
513 java.util.Map _compositeNode = (java.util.Map) $2;
514 //System.out.println(_localQName + " " + _compositeNode);
515 «type.builderName» _builder = new «type.builderName»();
516 boolean _is_empty = true;
517 «FOR child : node.childNodes»
518 «val signature = properties.getFor(child)»
519 «deserializeProperty(child, signature.value, signature.key)»
520 _builder.«signature.key.toSetter»(«signature.key»);
525 return _builder.build();
529 method(Object, "deserialize", Object) [
531 return fromDomStatic(QNAME,$1);
536 val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) as Class<? extends BindingCodec<Map<QName,Object>, Object>>
537 listener?.onDataContainerCodecCreated(inputType, ret);
539 } catch (Exception e) {
540 processException(inputType, e);
545 private def dispatch Class<? extends BindingCodec<Map<QName, Object>, Object>> generateTransformerFor(
546 Class<?> inputType, GeneratedType typeSpec, ChoiceNode node) {
549 //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
550 val ctCls = createClass(typeSpec.codecClassName) [
551 //staticField(Map,"AUGMENTATION_SERIALIZERS");
552 //staticQNameField(inputType);
553 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
554 staticField(it, IDENTITYREF_CODEC, BindingCodec)
555 staticField(it, CLASS_TO_CASE_MAP, Map)
556 staticField(it, COMPOSITE_TO_CASE, Map)
557 //staticField(it,QNAME_TO_CASE_MAP,BindingCodec)
558 implementsType(BINDING_CODEC)
559 method(List, "toDomStatic", QName, Object) [
560 modifiers = PUBLIC + FINAL + STATIC
566 «DataObject.name» _baValue = («DataObject.name») $2;
567 Class _baClass = _baValue.getImplementedInterface();
568 «BINDING_CODEC.name» _codec = «CLASS_TO_CASE_MAP».get(_baClass);
572 java.util.Map.Entry _input = new «SimpleEntry.name»($1,_baValue);
573 Object _ret = _codec.serialize(_input);
574 //System.out.println("«typeSpec.name»#toDomStatic: " + _ret);
575 return («List.name») _ret;
579 method(Object, "serialize", Object) [
581 throw new «UnsupportedOperationException.name»("Direct invocation not supported.");
584 method(Object, "fromDomStatic", QName, Map) [
585 modifiers = PUBLIC + FINAL + STATIC
588 «BINDING_CODEC.name» _codec = («BINDING_CODEC.name») «COMPOSITE_TO_CASE».get($2);
590 return _codec.deserialize(new «SimpleEntry.name»($1,$2));
596 method(Object, "deserialize", Object) [
598 throw new «UnsupportedOperationException.name»("Direct invocation not supported.");
603 val rawRet = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain)
604 val ret = rawRet as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
605 listener?.onChoiceCodecCreated(inputType, ret, node);
606 log.info("DOM Codec for {} was generated {}", inputType, ret)
608 } catch (Exception e) {
609 processException(inputType, e);
614 private def keyConstructorList(List<QName> qnames) {
615 val names = new TreeSet<String>()
616 for (name : qnames) {
617 val fieldName = name.getterName;
618 names.add(fieldName);
620 return Joiner.on(",").join(names);
623 private def serializeBodyFacade(GeneratedType type, SchemaNode node) {
624 val ret = serializeBody(type, node);
628 private def String deserializeBody(GeneratedType type, SchemaNode node) {
629 val ret = deserializeBodyImpl(type, node);
633 private def deserializeKey(GeneratedType type, ListSchemaNode node) {
634 if (node.keyDefinition != null && !node.keyDefinition.empty) {
636 «type.resolvedName»Key getKey = («type.resolvedName»Key) «keyTransformer(type, node).canonicalName».fromDomStatic(_localQName,_compositeNode);
637 _builder.setKey(getKey);
642 private def dispatch String deserializeBodyImpl(GeneratedType type, SchemaNode node) '''
644 «QName.name» _localQName = «QName.name».create($1,QNAME.getLocalName());
649 java.util.Map _compositeNode = (java.util.Map) $2;
650 «type.builderName» _builder = new «type.builderName»();
651 return _builder.build();
655 private def dispatch String deserializeBodyImpl(GeneratedType type, ListSchemaNode node) '''
657 «QName.name» _localQName = «QName.name».create($1,QNAME.getLocalName());
661 java.util.Map _compositeNode = (java.util.Map) $2;
662 «type.builderName» _builder = new «type.builderName»();
663 «deserializeKey(type, node)»
664 «deserializeDataNodeContainerBody(type, node)»
665 «deserializeAugmentations»
666 return _builder.build();
670 private def dispatch String deserializeBodyImpl(GeneratedType type, ContainerSchemaNode node) '''
672 «QName.name» _localQName = «QName.name».create($1,QNAME.getLocalName());
676 java.util.Map _compositeNode = (java.util.Map) $2;
677 «type.builderName» _builder = new «type.builderName»();
678 «deserializeDataNodeContainerBody(type, node)»
679 «deserializeAugmentations»
680 return _builder.build();
684 private def dispatch String deserializeBodyImpl(GeneratedType type, ChoiceCaseNode node) '''
686 «QName.name» _localQName = «QName.name».create($1,QNAME.getLocalName());
691 java.util.Map _compositeNode = (java.util.Map) $2;
692 //System.out.println(_localQName + " " + _compositeNode);
693 «type.builderName» _builder = new «type.builderName»();
694 «deserializeDataNodeContainerBody(type, node)»
695 «deserializeAugmentations»
696 return _builder.build();
700 private def deserializeDataNodeContainerBody(GeneratedType type, DataNodeContainer node) {
701 deserializeNodeContainerBodyImpl(type, type.allProperties, node);
704 private def deserializeNodeContainerBodyImpl(GeneratedType type, HashMap<String, Type> properties,
705 DataNodeContainer node) {
707 boolean _is_empty = true;
708 «FOR child : node.childNodes»
709 «val signature = properties.getFor(child)»
710 «IF signature !== null»
711 «deserializeProperty(child, signature.value, signature.key)»
712 _builder.«signature.key.toSetter»(«signature.key»);
719 def deserializeAugmentations() '''
720 java.util.Map _augmentation = (java.util.Map) «AUGMENTATION_CODEC».deserialize(_compositeNode);
721 if(_augmentation != null) {
722 «Iterator.name» _entries = _augmentation.entrySet().iterator();
723 while(_entries.hasNext()) {
724 java.util.Map.Entry _entry = (java.util.Map.Entry) _entries.next();
725 //System.out.println("Aug. key:" + _entry.getKey());
726 Class _type = (Class) _entry.getKey();
727 «Augmentation.resolvedName» _value = («Augmentation.name») _entry.getValue();
729 _builder.addAugmentation(_type,_value);
735 private def dispatch CharSequence deserializeProperty(ListSchemaNode schema, ParameterizedType type,
736 String propertyName) '''
737 java.util.List _dom_«propertyName» = _compositeNode.get(«QName.name».create(_localQName,"«schema.QName.
739 //System.out.println("«propertyName»#deCode"+_dom_«propertyName»);
740 java.util.List «propertyName» = new java.util.ArrayList();
741 if(_dom_«propertyName» != null) {
742 java.util.List _serialized = new java.util.ArrayList();
743 java.util.Iterator _iterator = _dom_«propertyName».iterator();
744 boolean _hasNext = _iterator.hasNext();
746 Object _listItem = _iterator.next();
748 //System.out.println(" item" + _listItem);
749 Object _value = «type.actualTypeArguments.get(0).serializer(schema).resolvedName».fromDomStatic(_localQName,_listItem);
750 //System.out.println(" value" + _value);
751 «propertyName».add(_value);
752 _hasNext = _iterator.hasNext();
756 //System.out.println(" list" + «propertyName»);
759 private def dispatch CharSequence deserializeProperty(LeafListSchemaNode schema, ParameterizedType type,
760 String propertyName) '''
761 java.util.List _dom_«propertyName» = _compositeNode.get(«QName.name».create(_localQName,"«schema.QName.
763 java.util.List «propertyName» = new java.util.ArrayList();
764 if(_dom_«propertyName» != null) {
765 java.util.List _serialized = new java.util.ArrayList();
766 java.util.Iterator _iterator = _dom_«propertyName».iterator();
767 boolean _hasNext = _iterator.hasNext();
770 Object _listItem = _iterator.next();
771 if(_listItem instanceof java.util.Map.Entry) {
772 Object _innerValue = ((java.util.Map.Entry) _listItem).getValue();
773 Object _value = «deserializeValue(type.actualTypeArguments.get(0), "_innerValue")»;
774 «propertyName».add(_value);
776 _hasNext = _iterator.hasNext();
781 private def dispatch CharSequence deserializeProperty(LeafSchemaNode schema, Type type, String propertyName) '''
782 java.util.List _dom_«propertyName»_list =
783 _compositeNode.get(«QName.name».create(_localQName,"«schema.QName.localName»"));
784 «type.resolvedName» «propertyName» = null;
785 if(_dom_«propertyName»_list != null && _dom_«propertyName»_list.size() > 0) {
787 java.util.Map.Entry _dom_«propertyName» = (java.util.Map.Entry) _dom_«propertyName»_list.get(0);
788 Object _inner_value = _dom_«propertyName».getValue();
789 «propertyName» = «deserializeValue(type, "_inner_value")»;
793 private def dispatch CharSequence deserializeProperty(ContainerSchemaNode schema, Type type,
794 String propertyName) '''
795 java.util.List _dom_«propertyName»_list =
796 _compositeNode.get(«QName.name».create(_localQName,"«schema.QName.localName»"));
797 «type.resolvedName» «propertyName» = null;
798 if(_dom_«propertyName»_list != null && _dom_«propertyName»_list.size() > 0) {
800 java.util.Map _dom_«propertyName» = (java.util.Map) _dom_«propertyName»_list.get(0);
801 «propertyName» = «type.serializer(schema).resolvedName».fromDomStatic(_localQName,_dom_«propertyName»);
805 private def dispatch CharSequence deserializeProperty(ChoiceNode schema, Type type, String propertyName) '''
806 «type.resolvedName» «propertyName» = «type.serializer(schema).resolvedName».fromDomStatic(_localQName,_compositeNode);
807 if(«propertyName» != null) {
812 private def dispatch String deserializeValue(GeneratedTransferObject type, String domParameter) '''
813 («type.resolvedName») «type.valueSerializer.resolvedName».fromDomValue(«domParameter»)
816 private def dispatch String deserializeValue(Enumeration type, String domParameter) '''
817 («type.resolvedName») «type.valueSerializer.resolvedName».fromDomValue(«domParameter»)
820 private def dispatch Class<? extends BindingCodec<Map<QName, Object>, Object>> generateValueTransformer(
821 Class<?> inputType, GeneratedTransferObject typeSpec) {
824 val returnType = typeSpec.valueReturnType;
825 if (returnType == null) {
826 val ctCls = createDummyImplementation(inputType, typeSpec);
827 val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain)
828 return ret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
830 if (returnType.name == 'char[]') {
831 val ctCls = createUnionImplementation(inputType, typeSpec);
832 val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain)
833 return ret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
836 val ctCls = createClass(typeSpec.codecClassName) [
837 //staticField(Map,"AUGMENTATION_SERIALIZERS");
838 if (inputType.isYangBindingAvailable) {
839 implementsType(BINDING_CODEC)
840 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
841 staticField(it, IDENTITYREF_CODEC, BindingCodec)
842 implementsType(BindingDeserializer.asCtClass)
844 method(Object, "toDomValue", Object) [
845 modifiers = PUBLIC + FINAL + STATIC
846 val ctSpec = typeSpec.asCtClass;
849 //System.out.println("«inputType.simpleName»#toDomValue: "+$1);
854 «typeSpec.resolvedName» _encapsulatedValue = («typeSpec.resolvedName») $1;
855 //System.out.println("«inputType.simpleName»#toDomValue:Enc: "+_encapsulatedValue);
856 «returnType.resolvedName» _value = _encapsulatedValue.getValue();
857 //System.out.println("«inputType.simpleName»#toDomValue:DeEnc: "+_value);
858 Object _domValue = «serializeValue(returnType, "_value")»;
863 method(Object, "serialize", Object) [
866 return toDomValue($1);
870 method(Object, "fromDomValue", Object) [
871 modifiers = PUBLIC + FINAL + STATIC
874 //System.out.println("«inputType.simpleName»#fromDomValue: "+$1);
879 «returnType.resolvedName» _simpleValue = «deserializeValue(returnType, "$1")»;
880 «typeSpec.resolvedName» _value = new «typeSpec.resolvedName»(_simpleValue);
885 method(Object, "deserialize", Object) [
887 return fromDomValue($1);
893 val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain)
894 log.info("DOM Codec for {} was generated {}", inputType, ret)
895 return ret as Class<? extends BindingCodec<Map<QName,Object>, Object>>;
896 } catch (Exception e) {
897 log.error("Cannot compile DOM Codec for {}", inputType, e);
898 val exception = new CodeGenerationException("Cannot compile Transformator for " + inputType);
899 exception.addSuppressed(e);
905 def createUnionImplementation(Class<?> inputType, GeneratedTransferObject typeSpec) {
906 return createClass(typeSpec.codecClassName) [
907 val properties = typeSpec.allProperties;
908 //staticField(Map,"AUGMENTATION_SERIALIZERS");
909 if (inputType.isYangBindingAvailable) {
910 implementsType(BINDING_CODEC)
911 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
912 staticField(it, IDENTITYREF_CODEC, BindingCodec)
913 implementsType(BindingDeserializer.asCtClass)
915 method(Object, "toDomValue", Object) [
916 modifiers = PUBLIC + FINAL + STATIC
917 val ctSpec = inputType.asCtClass;
920 //System.out.println("«inputType.simpleName»#toDomValue: "+$1);
925 «typeSpec.resolvedName» _value = («typeSpec.resolvedName») $1;
926 «FOR property : properties.entrySet»
927 «IF property.key != "getValue"»
928 «property.value.resolvedName» «property.key» = («property.value.resolvedName») _value.«property.key»();
929 if(«property.key» != null) {
930 return «serializeValue(property.value, property.key)»;
939 method(Object, "serialize", Object) [
942 return toDomValue($1);
946 method(Object, "fromDomValue", Object) [
947 modifiers = PUBLIC + FINAL + STATIC
950 //System.out.println("«inputType.simpleName»#fromDomValue: "+$1);
955 if($1 instanceof String) {
956 String _simpleValue = (String) $1;
957 return new «typeSpec.resolvedName»(_simpleValue.toCharArray());
963 method(Object, "deserialize", Object) [
965 return fromDomValue($1);
972 def boolean isYangBindingAvailable(Class<?> class1) {
974 val bindingCodecClass = class1.classLoader.loadClass(BINDING_CODEC.name);
975 return bindingCodecClass !== null;
976 } catch (ClassNotFoundException e) {
981 private def createDummyImplementation(Class<?> object, GeneratedTransferObject typeSpec) {
982 log.info("Generating Dummy DOM Codec for {} with {}", object, object.classLoader)
983 return createClass(typeSpec.codecClassName) [
984 if (object.isYangBindingAvailable) {
985 implementsType(BINDING_CODEC)
986 staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
987 staticField(it, IDENTITYREF_CODEC, BindingCodec)
988 implementsType(BindingDeserializer.asCtClass)
990 //implementsType(BindingDeserializer.asCtClass)
991 method(Object, "toDomValue", Object) [
992 modifiers = PUBLIC + FINAL + STATIC
997 return $1.toString();
1001 method(Object, "serialize", Object) [
1004 return toDomValue($1);
1008 method(Object, "fromDomValue", Object) [
1009 modifiers = PUBLIC + FINAL + STATIC
1010 bodyChecked = '''return null;'''
1012 method(Object, "deserialize", Object) [
1014 return fromDomValue($1);
1021 private def Type getValueReturnType(GeneratedTransferObject object) {
1022 for (prop : object.properties) {
1023 if (prop.name == "value") {
1024 return prop.returnType;
1027 if (object.superType != null) {
1028 return getValueReturnType(object.superType);
1033 private def dispatch Class<?> generateValueTransformer(Class<?> inputType, Enumeration typeSpec) {
1035 val typeRef = new ReferencedTypeImpl(typeSpec.packageName, typeSpec.name);
1036 val schema = typeToSchemaNode.get(typeRef) as ExtendedType;
1037 val enumSchema = schema.baseType as EnumerationType;
1039 //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
1040 val ctCls = createClass(typeSpec.codecClassName) [
1041 //staticField(Map,"AUGMENTATION_SERIALIZERS");
1042 //implementsType(BINDING_CODEC)
1043 method(Object, "toDomValue", Object) [
1044 modifiers = PUBLIC + FINAL + STATIC
1049 «typeSpec.resolvedName» _value = («typeSpec.resolvedName») $1;
1050 «FOR en : enumSchema.values»
1051 if(«typeSpec.resolvedName».«BindingGeneratorUtil.parseToClassName(en.name)».equals(_value)) {
1059 method(Object, "serialize", Object) [
1061 return toDomValue($1);
1064 method(Object, "fromDomValue", Object) [
1065 modifiers = PUBLIC + FINAL + STATIC
1071 String _value = (String) $1;
1072 «FOR en : enumSchema.values»
1073 if("«en.name»".equals(_value)) {
1074 return «typeSpec.resolvedName».«BindingGeneratorUtil.parseToClassName(en.name)»;
1081 method(Object, "deserialize", Object) [
1083 return fromDomValue($1);
1088 val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain)
1089 log.info("DOM Codec for {} was generated {}", inputType, ret)
1091 } catch (CodeGenerationException e) {
1092 throw new CodeGenerationException("Cannot compile Transformator for " + inputType, e);
1093 } catch (Exception e) {
1094 log.error("Cannot compile DOM Codec for {}", inputType, e);
1095 val exception = new CodeGenerationException("Cannot compile Transformator for " + inputType);
1096 exception.addSuppressed(e);
1102 def Class<?> toClassImpl(CtClass newClass, ClassLoader loader, ProtectionDomain domain) {
1103 val cls = newClass.toClass(loader, domain);
1104 if (classFileCapturePath !== null) {
1105 newClass.writeFile(classFileCapturePath.absolutePath);
1107 listener?.onCodecCreated(cls);
1111 def debugWriteClass(CtClass class1) {
1112 val path = class1.name.replace(".", "/") + ".class"
1114 val captureFile = new File(classFileCapturePath, path);
1115 captureFile.createNewFile
1119 private def dispatch String deserializeValue(Type type, String domParameter) {
1120 if (INSTANCE_IDENTIFIER.equals(type)) {
1121 return '''(«InstanceIdentifier.name») «INSTANCE_IDENTIFIER_CODEC».deserialize(«domParameter»)'''
1122 } else if (CLASS_TYPE.equals(type)) {
1123 return '''(«Class.name») «IDENTITYREF_CODEC».deserialize(«domParameter»)'''
1125 return '''(«type.resolvedName») «domParameter»'''
1133 private def dispatch CharSequence deserializeProperty(DataSchemaNode container, Type type, String propertyName) '''
1134 «type.resolvedName» «propertyName» = null;
1137 private def dispatch CharSequence deserializeProperty(DataSchemaNode container, GeneratedTypeBuilder type,
1138 String propertyName) {
1139 _deserializeProperty(container, type.toInstance, propertyName)
1142 public static def toSetter(String it) {
1144 if (startsWith("is")) {
1145 return "set" + substring(2);
1146 } else if (startsWith("get")) {
1147 return "set" + substring(3);
1153 private def dispatch CharSequence deserializeProperty(DataSchemaNode container,GeneratedType type, String propertyName) '''
1154 «type.resolvedName» «propertyName» = value.«propertyName»();
1155 if(«propertyName» != null) {
1156 Object domValue = «type.serializer».toDomStatic(QNAME,«propertyName»);
1157 _childNodes.add(domValue);
1161 private def getBuilderName(GeneratedType type) '''«type.resolvedName»Builder'''
1163 private def staticQNameField(CtClass it, QName node) {
1164 val field = new CtField(ctQName, "QNAME", it);
1165 field.modifiers = PUBLIC + FINAL + STATIC;
1167 '''«QName.asCtClass.name».create("«node.namespace»","«node.formattedRevision»","«node.localName»")''')
1170 private def dispatch String serializeBody(GeneratedType type, ListSchemaNode node) '''
1172 «QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
1173 java.util.List _childNodes = new java.util.ArrayList();
1174 «type.resolvedName» value = («type.resolvedName») $2;
1175 «transformDataContainerBody(type, type.allProperties, node)»
1176 «serializeAugmentations»
1177 return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
1181 private def dispatch String serializeBody(GeneratedType type, ContainerSchemaNode node) '''
1183 «QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
1184 java.util.List _childNodes = new java.util.ArrayList();
1185 «type.resolvedName» value = («type.resolvedName») $2;
1186 «transformDataContainerBody(type, type.allProperties, node)»
1187 «serializeAugmentations»
1188 return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
1192 private def dispatch String serializeBody(GeneratedType type, ChoiceCaseNode node) '''
1194 «QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
1195 java.util.List _childNodes = new java.util.ArrayList();
1196 «type.resolvedName» value = («type.resolvedName») $2;
1197 «transformDataContainerBody(type, type.allProperties, node)»
1198 «serializeAugmentations»
1199 return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
1203 private def dispatch String serializeBody(GeneratedType type, SchemaNode node) '''
1205 «QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
1206 java.util.List _childNodes = new java.util.ArrayList();
1207 «type.resolvedName» value = («type.resolvedName») $2;
1208 return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
1212 private def transformDataContainerBody(Type type, Map<String, Type> properties, DataNodeContainer node) {
1214 «FOR child : node.childNodes»
1215 «val signature = properties.getFor(child)»
1216 «IF signature !== null»
1217 //System.out.println("«type.name»#«signature.key»" + value.«signature.key»());
1218 «serializeProperty(child, signature.value, signature.key)»
1225 private def serializeAugmentations() '''
1226 java.util.List _augmentations = (java.util.List) «AUGMENTATION_CODEC».serialize(value);
1227 if(_augmentations != null) {
1228 _childNodes.addAll(_augmentations);
1232 def Entry<String, Type> getFor(Map<String, Type> map, DataSchemaNode node) {
1233 var sig = map.get(node.getterName);
1235 return new SimpleEntry(node.getterName, sig);
1237 sig = map.get(node.booleanGetterName);
1239 return new SimpleEntry(node.booleanGetterName, map.get(node.booleanGetterName));
1244 private static def String getBooleanGetterName(DataSchemaNode node) {
1245 return "is" + BindingGeneratorUtil.parseToClassName(node.QName.localName);
1248 private static def String getGetterName(DataSchemaNode node) {
1249 return "get" + BindingGeneratorUtil.parseToClassName(node.QName.localName);
1252 private static def String getGetterName(QName node) {
1253 return "get" + BindingGeneratorUtil.parseToClassName(node.localName);
1256 private def dispatch CharSequence serializeProperty(ListSchemaNode schema, ParameterizedType type,
1257 String propertyName) '''
1258 «type.resolvedName» «propertyName» = value.«propertyName»();
1259 //System.out.println("«propertyName»:" + «propertyName»);
1260 if(«propertyName» != null) {
1261 java.util.Iterator _iterator = «propertyName».iterator();
1262 boolean _hasNext = _iterator.hasNext();
1264 Object _listItem = _iterator.next();
1265 Object _domValue = «type.actualTypeArguments.get(0).serializer(schema).resolvedName».toDomStatic(_resultName,_listItem);
1266 _childNodes.add(_domValue);
1267 _hasNext = _iterator.hasNext();
1272 private def dispatch CharSequence serializeProperty(LeafSchemaNode schema, Type type, String propertyName) '''
1273 «type.resolvedName» «propertyName» = value.«propertyName»();
1275 if(«propertyName» != null) {
1276 «QName.name» _qname = «QName.name».create(_resultName,"«schema.QName.localName»");
1277 Object _propValue = «serializeValue(type, propertyName)»;
1278 if(_propValue != null) {
1279 Object _domValue = java.util.Collections.singletonMap(_qname,_propValue);
1280 _childNodes.add(_domValue);
1285 private def dispatch serializeValue(GeneratedTransferObject type, String parameter) '''«type.valueSerializer.
1286 resolvedName».toDomValue(«parameter»)'''
1288 private def dispatch serializeValue(Enumeration type, String parameter) '''«type.valueSerializer.resolvedName».toDomValue(«parameter»)'''
1290 private def dispatch serializeValue(Type signature, String property) {
1291 if (INSTANCE_IDENTIFIER == signature) {
1292 return '''«INSTANCE_IDENTIFIER_CODEC».serialize(«property»)'''
1293 } else if (CLASS_TYPE.equals(signature)) {
1294 return '''(«QName.resolvedName») «IDENTITYREF_CODEC».serialize(«property»)'''
1296 if ("char[]" == signature.name) {
1297 return '''new String(«property»)''';
1299 return '''«property»''';
1302 private def dispatch CharSequence serializeProperty(LeafListSchemaNode schema, ParameterizedType type,
1303 String propertyName) '''
1304 «type.resolvedName» «propertyName» = value.«propertyName»();
1305 if(«propertyName» != null) {
1306 «QName.name» _qname = «QName.name».create(_resultName,"«schema.QName.localName»");
1307 java.util.Iterator _iterator = «propertyName».iterator();
1308 boolean _hasNext = _iterator.hasNext();
1310 Object _listItem = _iterator.next();
1311 Object _propValue = «serializeValue(type.actualTypeArguments.get(0), "_listItem")»;
1312 Object _domValue = java.util.Collections.singletonMap(_qname,_propValue);
1313 _childNodes.add(_domValue);
1314 _hasNext = _iterator.hasNext();
1319 private def dispatch CharSequence serializeProperty(ChoiceNode container, GeneratedType type,
1320 String propertyName) '''
1321 «type.resolvedName» «propertyName» = value.«propertyName»();
1322 if(«propertyName» != null) {
1323 java.util.List domValue = «type.serializer(container).resolvedName».toDomStatic(_resultName,«propertyName»);
1324 _childNodes.addAll(domValue);
1332 private def dispatch CharSequence serializeProperty(DataSchemaNode container, Type type, String propertyName) '''
1333 «type.resolvedName» «propertyName» = value.«propertyName»();
1334 if(«propertyName» != null) {
1335 Object domValue = «propertyName»;
1336 _childNodes.add(domValue);
1340 private def dispatch CharSequence serializeProperty(DataSchemaNode container, GeneratedTypeBuilder type,
1341 String propertyName) {
1342 serializeProperty(container, type.toInstance, propertyName)
1345 private def dispatch CharSequence serializeProperty(DataSchemaNode container, GeneratedType type,
1346 String propertyName) '''
1347 «type.resolvedName» «propertyName» = value.«propertyName»();
1348 if(«propertyName» != null) {
1349 Object domValue = «type.serializer(container).resolvedName».toDomStatic(_resultName,«propertyName»);
1350 _childNodes.add(domValue);
1354 private def codecClassName(GeneratedType typeSpec) {
1355 return '''«typeSpec.resolvedName»$Broker$Codec$DOM'''
1358 private def codecClassName(Class<?> typeSpec) {
1359 return '''«typeSpec.name»$Broker$Codec$DOM'''
1362 private def HashMap<String, Type> getAllProperties(GeneratedType type) {
1363 val ret = new HashMap<String, Type>();
1364 type.collectAllProperties(ret);
1368 private def dispatch void collectAllProperties(GeneratedType type, Map<String, Type> set) {
1369 for (definition : type.methodDefinitions) {
1370 set.put(definition.name, definition.returnType);
1372 for (property : type.properties) {
1373 set.put(property.getterName, property.returnType);
1375 for (parent : type.implements) {
1376 parent.collectAllProperties(set);
1380 def String getGetterName(GeneratedProperty property) {
1381 return "get" + property.name.toFirstUpper
1384 private def dispatch void collectAllProperties(Type type, Map<String, Type> set) {
1385 // NOOP for generic type.
1388 def String getResolvedName(Type type) {
1389 return type.asCtClass.name;
1392 def String getResolvedName(Class<?> type) {
1393 return type.asCtClass.name;
1396 def CtClass asCtClass(Type type) {
1397 val cls = loadClassWithTCCL(type.fullyQualifiedName)
1398 return cls.asCtClass;
1401 private def dispatch processException(Class<?> inputType, CodeGenerationException e) {
1402 log.error("Cannot compile DOM Codec for {}. One of it's prerequisites was not generated.", inputType);
1406 private def dispatch processException(Class<?> inputType, Exception e) {
1407 log.error("Cannot compile DOM Codec for {}", inputType, e);
1408 val exception = new CodeGenerationException("Cannot compile Transformator for " + inputType, e);
1412 private def setBodyChecked(CtMethod method, String body) {
1414 method.setBody(body);
1415 } catch (CannotCompileException e) {
1416 log.error("Cannot compile method: {}#{} {}, Reason: {} Body: {}", method.declaringClass, method.name,
1417 method.signature, e.message, body)
1422 private def <V> V withClassLoaderAndLock(ClassLoader cls, Lock lock, Callable<V> function) throws Exception {
1423 appendClassLoaderIfMissing(cls);
1424 ClassLoaderUtils.withClassLoaderAndLock(cls, lock, function);
1430 class PropertyPair {
1439 SchemaNode schemaNode;