All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.undefinedlabs.scope.agent.ScopeClassLoaderMatcher Maven / Gradle / Ivy

package com.undefinedlabs.scope.agent;

import java.util.Map;
import java.util.WeakHashMap;
import net.bytebuddy.matcher.ElementMatcher;

public class ScopeClassLoaderMatcher {
  public static final ClassLoader BOOTSTRAP_CLASSLOADER = null;

  public static ElementMatcher.Junction.AbstractBase skipClassLoader() {
    return SkipClassLoaderMatcher.INSTANCE;
  }

  public static ElementMatcher.Junction.AbstractBase hasClassesNamed(
      final String... classNames) {
    return new ClassLoaderHasClassesNamedMatcher(classNames);
  }

  private static final class SkipClassLoaderMatcher
      extends ElementMatcher.Junction.AbstractBase {

    public static final SkipClassLoaderMatcher INSTANCE = new SkipClassLoaderMatcher();

    @Override
    public boolean matches(final ClassLoader loader) {
      if (loader == BOOTSTRAP_CLASSLOADER) {
        return false;
      }

      switch (loader.getClass().getName()) {
        case "sun.reflect.DelegatingClassLoader":
        case "jdk.internal.reflect.DelegatingClassLoader":
        case "sun.misc.Launcher$ExtClassLoader":
          return true;
      }
      return false;
    }
  }

  private static final class ClassLoaderHasClassesNamedMatcher
      extends ElementMatcher.Junction.AbstractBase {

    private final String[] resources;
    private final Map cache = new WeakHashMap<>(25);

    private ClassLoaderHasClassesNamedMatcher(final String... classNames) {
      resources = classNames;
      for (int i = 0; i < resources.length; i++) {
        resources[i] = resources[i].replace(".", "/") + ".class";
      }
    }

    private boolean hasResources(final ClassLoader cl) {
      for (final String resource : resources) {
        if (cl.getResource(resource) == null) {
          return false;
        }
      }
      return true;
    }

    @Override
    public boolean matches(final ClassLoader cl) {
      if (cl == BOOTSTRAP_CLASSLOADER) {
        // Can't match the bootstrap classloader.
        return false;
      }

      final Boolean cached;
      if ((cached = cache.get(cl)) != null) {
        return cached;
      }

      final boolean hasResources = hasResources(cl);
      cache.put(cl, hasResources);
      return hasResources;
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy