X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=binding%2Fmdsal-binding-dom-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fcodec%2Floader%2FLeafCodecClassLoader.java;fp=binding%2Fmdsal-binding-dom-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fcodec%2Floader%2FLeafCodecClassLoader.java;h=eebeb6c8184474738f618b89e29b7ba23618a7b2;hb=3106784dac024576f56095b2aff7ef715538da08;hp=fdf29037614afb3e8c30281b34a1f2eb55da2663;hpb=d4e362b68ea1cc5785bd6a01dff25dddb1213d81;p=mdsal.git diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/LeafCodecClassLoader.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/LeafCodecClassLoader.java index fdf2903761..eebeb6c818 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/LeafCodecClassLoader.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/LeafCodecClassLoader.java @@ -10,7 +10,14 @@ package org.opendaylight.mdsal.binding.dom.codec.loader; import static com.google.common.base.Verify.verify; import static java.util.Objects.requireNonNull; +import com.google.common.collect.ImmutableSet; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import org.eclipse.jdt.annotation.NonNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; // A leaf class loader, binding together a root class loader and some other class loader final class LeafCodecClassLoader extends CodecClassLoader { @@ -18,8 +25,15 @@ final class LeafCodecClassLoader extends CodecClassLoader { verify(registerAsParallelCapable()); } - private final @NonNull ClassLoader target; + private static final Logger LOG = LoggerFactory.getLogger(LeafCodecClassLoader.class); + private final @NonNull RootCodecClassLoader root; + private final @NonNull ClassLoader target; + + @SuppressWarnings("rawtypes") + private static final AtomicReferenceFieldUpdater DEPENDENCIES_UPDATER = + AtomicReferenceFieldUpdater.newUpdater(LeafCodecClassLoader.class, ImmutableSet.class, "dependencies"); + private volatile ImmutableSet dependencies = ImmutableSet.of(); LeafCodecClassLoader(final RootCodecClassLoader root, final ClassLoader target) { super(root); @@ -29,7 +43,20 @@ final class LeafCodecClassLoader extends CodecClassLoader { @Override protected Class findClass(final String name) throws ClassNotFoundException { - return target.loadClass(name); + try { + return target.loadClass(name); + } catch (ClassNotFoundException e) { + LOG.trace("Class {} not found in target, looking through dependencies", name); + for (LeafCodecClassLoader loader : dependencies) { + final Class loaded = loader.findLoadedClass(name); + if (loaded != null) { + LOG.trace("Class {} found in dependency {}", name, loader); + return loaded; + } + } + + throw e; + } } @Override @@ -37,4 +64,19 @@ final class LeafCodecClassLoader extends CodecClassLoader { final ClassLoader bindingTarget = bindingClass.getClassLoader(); return target.equals(bindingTarget) ? this : root.findClassLoader(bindingClass); } + + @Override + void appendLoaders(final Set newLoaders) { + while (true) { + final ImmutableSet local = dependencies; + final List builder = new ArrayList<>(local.size() + newLoaders.size()); + builder.addAll(local); + builder.addAll(newLoaders); + final ImmutableSet updated = ImmutableSet.copyOf(builder); + if (local.equals(updated) || DEPENDENCIES_UPDATER.compareAndSet(this, local, updated)) { + // No need for an update or the update was successful + return; + } + } + } }