X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fbinding%2Fcodegen%2Fimpl%2FRuntimeCodeGenerator.xtend;h=d47c0f9ab7c39455fc040c0a766c75b92131ce9b;hp=7ebcf02e41fb0ba7e17268aeee1d13f679ff3d31;hb=23c447f8bd2b5b2591ed699c1de1b11cc71a6e27;hpb=ff42855d9de0ab5e8c409ccde914e6f501676ddb diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend index 7ebcf02e41..d47c0f9ab7 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend @@ -7,49 +7,42 @@ */ package org.opendaylight.controller.sal.binding.codegen.impl +import java.util.HashMap +import java.util.HashSet +import java.util.Map +import java.util.WeakHashMap import javassist.ClassPool -import org.opendaylight.yangtools.yang.binding.RpcService - import javassist.CtClass import javassist.CtMethod -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier -import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext +import javassist.LoaderClassPath +import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeHelper +import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory +import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory.NotificationInvoker +import org.opendaylight.yangtools.sal.binding.generator.util.ClassLoaderUtils +import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils import org.opendaylight.yangtools.yang.binding.BaseIdentity - -import java.util.Map -import java.util.HashMap - - -import org.opendaylight.yangtools.yang.binding.NotificationListener +import org.opendaylight.yangtools.yang.binding.DataContainer +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier import org.opendaylight.yangtools.yang.binding.Notification +import org.opendaylight.yangtools.yang.binding.NotificationListener +import org.opendaylight.yangtools.yang.binding.RpcImplementation +import org.opendaylight.yangtools.yang.binding.RpcService +import org.opendaylight.yangtools.yang.binding.annotations.QName +import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext +import static org.opendaylight.yangtools.concepts.util.ClassLoaderUtils.* -import static extension org.opendaylight.controller.sal.binding.codegen.YangtoolsMappingHelper.* import static extension org.opendaylight.controller.sal.binding.codegen.RuntimeCodeSpecification.* -import java.util.HashSet -import static org.opendaylight.yangtools.concepts.util.ClassLoaderUtils.* -import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory -import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory.NotificationInvoker -import java.util.Set -import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeHelper -import java.util.WeakHashMap -import org.opendaylight.yangtools.yang.binding.annotations.QName -import org.opendaylight.yangtools.yang.binding.DataContainer -import org.opendaylight.yangtools.yang.binding.RpcImplementation -import org.opendaylight.controller.sal.binding.codegen.util.JavassistUtils -import org.opendaylight.controller.sal.binding.impl.util.ClassLoaderUtils -import javassist.LoaderClassPath +import static extension org.opendaylight.controller.sal.binding.codegen.YangtoolsMappingHelper.* class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.codegen.RuntimeCodeGenerator, NotificationInvokerFactory { val CtClass BROKER_NOTIFICATION_LISTENER; - val ClassPool classPool; val extension JavassistUtils utils; val Map, RuntimeGeneratedInvokerPrototype> invokerClasses; new(ClassPool pool) { - classPool = pool; utils = new JavassistUtils(pool); invokerClasses = new WeakHashMap(); BROKER_NOTIFICATION_LISTENER = org.opendaylight.controller.sal.binding.api.NotificationListener.asCtClass; @@ -71,7 +64,7 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co body = ''' { if(«DELEGATE_FIELD» == null) { - throw new java.lang.IllegalStateException("No provider is processing supplied message"); + throw new java.lang.IllegalStateException("No default provider is available"); } return ($r) «DELEGATE_FIELD».«it.name»($$); } @@ -91,12 +84,12 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co return instance; } - override getRouterFor(Class iface) { + override getRouterFor(Class iface,String routerInstanceName) { val metadata = withClassLoader(iface.classLoader) [| val supertype = iface.asCtClass return supertype.rpcMetadata; ] - + val instance = withClassLoaderAndLock(iface.classLoader,lock) [ | val supertype = iface.asCtClass val routerName = iface.routerName; @@ -104,14 +97,14 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co if(potentialClass != null) { return potentialClass.newInstance as T; } - + val targetCls = createClass(iface.routerName, supertype) [ - - + + field(DELEGATE_FIELD, iface) //field(REMOTE_INVOKER_FIELD,iface); implementsType(RpcImplementation.asCtClass) - + for (ctx : metadata.contexts) { field(ctx.routingTableField, Map) } @@ -127,7 +120,7 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co instance = «DELEGATE_FIELD»; } if(instance == null) { - throw new java.lang.IllegalStateException("No provider is processing supplied message"); + throw new java.lang.IllegalStateException("No routable provider is processing routed message for " + String.valueOf(identifier)); } return ($r) instance.«it.name»($$); }''' @@ -146,14 +139,14 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co ] ] return targetCls.toClass(iface.classLoader,iface.protectionDomain).newInstance as T - + ]; - return new RpcRouterCodegenInstance(iface, instance, metadata.contexts,metadata.supportedInputs); + return new RpcRouterCodegenInstance(routerInstanceName,iface, instance, metadata.contexts,metadata.supportedInputs); } private def RpcServiceMetadata getRpcMetadata(CtClass iface) { val metadata = new RpcServiceMetadata; - + iface.methods.filter[declaringClass == iface && parameterTypes.size === 1].forEach [ method | val routingPair = method.rpcMetadata; if (routingPair !== null) { @@ -168,7 +161,7 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co } private def getRpcMetadata(CtMethod method) { - val inputClass = method.parameterTypes.get(0); + val inputClass = method.parameterTypes.get(0); return inputClass.rpcMethodMetadata(inputClass,method.name); } @@ -232,7 +225,7 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co finalClass as Class>); } - + @@ -245,7 +238,7 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co val newInvoker = generateListenerInvoker(class1); invokerClasses.put(class1, newInvoker); return newInvoker - + ] } } @@ -277,16 +270,6 @@ package class RuntimeGeneratedInvoker implements NotificationInvoker { } } -@Data -package class RuntimeGeneratedInvokerPrototype { - - @Property - val Set> supportedNotifications; - - @Property - val Class> protoClass; -} - package class RpcServiceMetadata { @Property @@ -294,11 +277,11 @@ package class RpcServiceMetadata { @Property val rpcMethods = new HashMap(); - + @Property val rpcInputs = new HashMap, RpcMetadata>(); - - + + @Property val supportedInputs = new HashSet>(); } @@ -319,7 +302,7 @@ package class RpcMetadata { @Property val boolean routeEncapsulated; - + @Property val CtClass inputType; }