docs: @Override
      public void introspect(PrintWriter out) throws Exception {
  
          out.println("Resource Providers:");
          MultiMap<String, ResourceProvider> resourceProviderMap = resourceProviders.getProviderMap();
          for (String resName : resourceProviderMap.keys()) {
              out.println("  " + resName + " provided by:");
              for (ResourceProvider rp : resourceProviderMap.get(resName)) {
                  out.println("    " + rp); //TODO: print bundle info from rp reflectively
              }
          }
  
          out.println();
          out.println();
  
          out.println("Gateway Loaders:");
          for (Entry<Bundle, Set<GatewayClassLoader>> entry : classloaders.entrySet()) {
              Bundle b = entry.getKey();
              out.println("  " + b.getSymbolicName());
              for (GatewayClassLoader gcl : entry.getValue()) {
                  out.println("    " + gcl.getBundle().getSymbolicName() + " " + gcl.getApiTypeVisibility());
              }
          }
  
          out.println();
          out.println();
  
          Library gsl = globalSharedLibrary.get();
          if (gsl == null) {
              out.println("Global Shared Library not configured");
          } else {
              out.println("Global Shared Library contents:");
              out.println("  filesets:");
              for (Fileset fileset : gsl.getFilesets()) {
                  String dir = fileset.getDir();
                  for (File file : fileset.getFileset()) {
                      out.println("    " + dir + "  " + file.getPath());
                  }
              }
              out.println("  folders:");
              for (File folder : gsl.getFolders()) {
                  out.println("    " + folder.getAbsolutePath());
              }
              out.println("  files:");
              for (File file : gsl.getFiles()) {
                  out.println("    " + file.getAbsolutePath());
              }
          }
  
          out.println();
          out.println();
          out.println("Leaked (or active) TCCLs - note that tracing must be enabled to see these stacks:");
          for (Map.Entry<ClassLoader, StackTraceElement[]> entry : leakDetectionMap.entrySet()) {
              ClassLoader cl = entry.getKey();
              StackTraceElement[] stes = entry.getValue();
              out.println("  " + cl + " created via");
              for (StackTraceElement ste : stes) {
                  out.println("    " + ste.toString());
              }
          }
      }