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=a6634383f3313ab94e41046a6f426eac8b1515da;hp=ab2e96f05c09b0e79502547e9502ffc697dd8b2b;hpb=c5aaa057429dbceb764a50c24b2f4d21f05e1fc3;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 ab2e96f05c..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 @@ -46,6 +46,11 @@ 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 { @@ -75,6 +80,9 @@ class TransformerGenerator { @Property var Map typeToDefinition = new ConcurrentHashMap(); + @Property + var Map pathToType = new ConcurrentHashMap(); + @Property var Map typeToSchemaNode = new ConcurrentHashMap(); @@ -102,6 +110,27 @@ class TransformerGenerator { 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); @@ -202,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) { @@ -221,6 +248,19 @@ class TransformerGenerator { ] } + 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 { @@ -342,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; @@ -548,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) { @@ -692,7 +734,7 @@ class TransformerGenerator { Object _listItem = _iterator.next(); _is_empty = false; //System.out.println(" item" + _listItem); - Object _value = «type.actualTypeArguments.get(0).serializer.resolvedName».fromDomStatic(_localQName,_listItem); + Object _value = «type.actualTypeArguments.get(0).serializer(schema).resolvedName».fromDomStatic(_localQName,_listItem); //System.out.println(" value" + _value); «propertyName».add(_value); _hasNext = _iterator.hasNext(); @@ -744,12 +786,12 @@ class TransformerGenerator { 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; } @@ -759,6 +801,10 @@ class TransformerGenerator { («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( Class inputType, GeneratedTransferObject typeSpec) { try { @@ -888,6 +934,9 @@ class TransformerGenerator { private def dispatch Class generateValueTransformer(Class inputType, Enumeration typeSpec) { try { + val typeRef = new ReferencedTypeImpl(typeSpec.packageName, typeSpec.name); + val schema = typeToSchemaNode.get(typeRef) as ExtendedType; + val enumSchema = schema.baseType as EnumerationType; //log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val ctCls = createClass(typeSpec.codecClassName) [ @@ -895,12 +944,18 @@ class TransformerGenerator { //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) [ @@ -911,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) [ @@ -1103,7 +1164,7 @@ class TransformerGenerator { 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(); } @@ -1126,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»)''' @@ -1154,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); } ''' @@ -1180,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); } '''