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%2Fcodegen%2Futil%2FJavassistUtils.xtend;h=74efffafc6f590ed0a1804abc22409c219a877d3;hb=66af51651ec5099484fc25ae53eaf38370bb9f30;hp=19737b83c628caa531edb74d3fbb8bcc1531d2db;hpb=b73670a92d1cc57d24c0da4df22b7b3d3c4fb875;p=controller.git diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/util/JavassistUtils.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/util/JavassistUtils.xtend index 19737b83c6..74efffafc6 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/util/JavassistUtils.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/util/JavassistUtils.xtend @@ -10,10 +10,22 @@ import javassist.Modifier import javassist.NotFoundException import javassist.LoaderClassPath import javassist.ClassClassPath +import java.util.concurrent.locks.Lock +import java.util.concurrent.locks.ReentrantLock +import org.slf4j.LoggerFactory +import java.util.HashMap +import java.util.WeakHashMap class JavassistUtils { + private static val LOG = LoggerFactory.getLogger(JavassistUtils); + + private val loaderClassPaths = new WeakHashMap(); + ClassPool classPool + + @Property + val Lock lock = new ReentrantLock(); new(ClassPool pool) { classPool = pool; @@ -49,12 +61,14 @@ class JavassistUtils { } def CtClass createClass(String fqn, ClassGenerator cls) { + val target = classPool.makeClass(fqn); cls.process(target); return target; } def CtClass createClass(String fqn, CtClass superInterface, ClassGenerator cls) { + val target = classPool.makeClass(fqn); target.implementsType(superInterface); cls.process(target); @@ -76,19 +90,39 @@ class JavassistUtils { addField(field); return field; } + + def CtField staticField(CtClass it, String name, Class returnValue) { + val field = new CtField(returnValue.asCtClass, name, it); + field.modifiers = Modifier.PUBLIC + Modifier.STATIC + addField(field); + return field; + } def get(ClassPool pool, Class cls) { try { return pool.get(cls.name) } catch (NotFoundException e) { - pool.appendClassPath(new LoaderClassPath(cls.classLoader)); + appendClassLoaderIfMissing(cls.classLoader) try { return pool.get(cls.name) - } catch (NotFoundException ef) { + LOG.warn("Appending ClassClassPath for {}",cls); pool.appendClassPath(new ClassClassPath(cls)); + return pool.get(cls.name) } } } + + def void appendClassLoaderIfMissing(ClassLoader loader) { + if(loaderClassPaths.containsKey(loader)) { + return; + } + val ctLoader = new LoaderClassPath(loader); + classPool.appendClassPath(ctLoader); + } + + def void ensureClassLoader(Class child) { + appendClassLoaderIfMissing(child.classLoader); + } }