X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fcodec%2Floader%2FRootCodecClassLoader.java;fp=binding%2Fmdsal-binding-dom-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fcodec%2Floader%2FRootCodecClassLoader.java;h=5465e83cacffad343fab0463ae573e005335da41;hb=f6f3556fd543e3af5a239f5e8666c6305a6b8f5a;hp=1b2b8023d9e198307699767a329f63c85f3247f0;hpb=d8e14e7435ad76f4c1ccb1080a3b0206f62f66e5;p=mdsal.git diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/RootCodecClassLoader.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/RootCodecClassLoader.java index 1b2b8023d9..5465e83cac 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/RootCodecClassLoader.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/RootCodecClassLoader.java @@ -8,6 +8,7 @@ package org.opendaylight.mdsal.binding.dom.codec.loader; import static com.google.common.base.Verify.verify; +import static com.google.common.base.Verify.verifyNotNull; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; @@ -15,12 +16,14 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Set; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; +import org.opendaylight.yangtools.yang.binding.DataContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; // A root codec classloader, binding only whatever is available StaticClassPool final class RootCodecClassLoader extends CodecClassLoader { private static final Logger LOG = LoggerFactory.getLogger(RootCodecClassLoader.class); + private static final ClassLoader LOADER = verifyNotNull(RootCodecClassLoader.class.getClassLoader()); static { verify(registerAsParallelCapable()); @@ -33,7 +36,7 @@ final class RootCodecClassLoader extends CodecClassLoader { private volatile ImmutableMap loaders = ImmutableMap.of(); RootCodecClassLoader() { - super(); + super(LOADER); } @Override @@ -55,7 +58,7 @@ final class RootCodecClassLoader extends CodecClassLoader { // ourselves) or we need to create a new Leaf. final CodecClassLoader found; if (!isOurClass(bindingClass)) { - StaticClassPool.verifyStaticLinkage(target); + verifyStaticLinkage(target); found = AccessController.doPrivileged( (PrivilegedAction)() -> new LeafCodecClassLoader(this, target)); } else { @@ -99,4 +102,17 @@ final class RootCodecClassLoader extends CodecClassLoader { } return bindingClass.equals(ourClass); } + + // Sanity check: target has to resolve yang-binding contents to the same class, otherwise we are in a pickle + private static void verifyStaticLinkage(final ClassLoader candidate) { + final Class targetClazz; + try { + targetClazz = candidate.loadClass(DataContainer.class.getName()); + } catch (ClassNotFoundException e) { + throw new IllegalStateException("ClassLoader " + candidate + " cannot load " + DataContainer.class, e); + } + verify(DataContainer.class.equals(targetClazz), + "Class mismatch on DataContainer. Ours is from %s, target %s has %s from %s", + DataContainer.class.getClassLoader(), candidate, targetClazz, targetClazz.getClassLoader()); + } }