X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fbinding%2Fdom%2Fserializer%2Fimpl%2FTransformerGenerator.xtend;h=01390d7c41612e819b3cffc9964538f66263bf38;hb=f062dc05cc7caaf0c1811856370f1c9e2f1e5c34;hp=8e059aa22ed4e8ec1946afc18154b5fe9a38ded6;hpb=4e6f0838e508e0dce5dfa62faa29b43e979f5ef8;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..01390d7c41 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 @@ -95,6 +95,7 @@ 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) @@ -102,6 +103,7 @@ class TransformerGenerator { val typeSpecBuilder = typeToDefinition.get(ref) val typeSpec = typeSpecBuilder.toInstance(); val newret = generateTransformerFor(inputType, typeSpec, node); + listener.onClassProcessed(inputType); return newret as Class, Object>>; ] } @@ -117,6 +119,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 +187,7 @@ class TransformerGenerator { ] } - private def Class getGeneratedClass(Class cls) { + private def Class getGeneratedClass(Class cls) { try { return loadClassWithTCCL(cls.codecClassName) @@ -211,13 +214,15 @@ 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 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 +240,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)» @@ -261,7 +266,7 @@ class TransformerGenerator { «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,10 +296,10 @@ 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) @@ -308,7 +313,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; } ''' @@ -349,9 +354,9 @@ 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); @@ -396,9 +401,9 @@ 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"); @@ -446,7 +451,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»(); «FOR child : node.childNodes» «val signature = properties.getFor(child)» @@ -475,9 +480,9 @@ 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 +505,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; } ''' ] @@ -617,7 +624,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» @@ -660,7 +667,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 +675,15 @@ class TransformerGenerator { boolean _hasNext = _iterator.hasNext(); while(_hasNext) { Object _listItem = _iterator.next(); - ////System.out.println(" item" + _listItem); + //System.out.println(" item" + _listItem); Object _value = «type.actualTypeArguments.get(0).serializer.resolvedName».fromDomStatic(_localQName,_listItem); - ////System.out.println(" value" + _value); + //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, @@ -737,29 +744,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 +792,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,13 +865,14 @@ class TransformerGenerator { return null; } - private def dispatch Class, Object>> generateValueTransformer( + private def dispatch Class generateValueTransformer( Class inputType, Enumeration typeSpec) { 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"); - implementsType(BINDING_CODEC) + //implementsType(BINDING_CODEC) + method(Object, "toDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC body = ''' @@ -891,7 +908,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) { @@ -982,7 +999,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 +1010,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 +1021,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,11 +1036,11 @@ 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»()); + //System.out.println("«type.name»#«signature.key»" + value.«signature.key»()); «serializeProperty(child, signature.value, signature.key)» «ENDFOR» ''' @@ -1152,11 +1169,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 +1203,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; }