docs: protected static void customize(BootstrapConfig config) {
          File workarea = config.getWorkareaFile(null);
  
          // Specify the storage area that this framework should use:
          // because information about installed/started bundles is contained in
          // that storage area, we use space specific to the server.
          config.put(org.osgi.framework.Constants.FRAMEWORK_STORAGE, workarea.getAbsolutePath());
  
          config.put("osgi.logfile", new File(workarea, "equinox.log").getAbsolutePath());
  
          // Use an equinox property to identify the location of the equinox
          // user area (we'll treat the server directory as the user area)
          config.put("osgi.user.area", workarea.getParent());
  
          // Use an equinox property to identify the location of the equinox
          // instance area.
          config.put("osgi.instance.area", workarea.getAbsolutePath());
  
          // Without this equinox property set, Equinox will create a non-daemon
          // thread to ensure that the framework doesn't just exit when it's idle.
          // Since we drive waitForStop with the main thread, we don't need
          // equinox to do that.
          config.put("osgi.framework.activeThreadType", "none");
  
          // Use an equinox property to ensure that equinox checks whether or not
          // the jar files we're installing (for file:// URLs) have changed if
          // osgi is not starting clean. If the bundle jar has changed, associated
          // cached data is tossed.
          config.put("osgi.checkConfiguration", "true");
  
          // We do not want Bundle-ActivationPolicy: lazy to cause bundle
          // resolution to automatically start bundles.
          config.put("osgi.compatibility.eagerStart.LazyActivation", "false");
  
          // We need to allow badly formed bundles to provide osgi.ee and osgi.native
          // capabilities in order to keep zero migration.
          config.put("osgi.equinox.allow.restricted.provides", "true");
  
          // It would be good if we could not set this, but it really craters the build image if we don't
          // this is because build image installs loads of bundles together that introduce enormous uses constraint issues.
          config.put("equinox.resolver.revision.batch.size", "1");
          // It is not clear that multi-threading really helps with performance of the resolver.
          config.put("equinox.resolver.thead.count", "1");
  
          // The IBM shared class adapter issues a message if it's loaded on a
          // non-IBM JVM.  Since it does no harm, we'll suppress the message.
          AccessController.doPrivileged(new PrivilegedAction<Void>() {
              @Override
              public Void run() {
                  System.setProperty("ibm.cds.suppresserrors", "true");
                  return null;
              }
          });
  
          // Want to bind to the port specified but set the address to be localhost
          // unless it is explicitly overridden.  To listen on all addresses, '*'
          // should be specified.
          String port = config.get("osgi.console");
          if (port != null && !"".equals(port)) {
              int colon = port.indexOf(':');
              if (colon == -1) {
                  port = "localhost:" + port;
              } else if (port.startsWith("*:")) {
                  port = port.substring(colon + 1);
              }
              config.put("osgi.console", port);
          }
  
          // We do not want unnecessary write checks to happen in the install area
          // This causes grief for SE Linux enforcement of read-only install areas (see RTC defect 93452)
          config.put("eclipse.home.location.readOnly", "true");
  
          // Disabling implicit boot delegation altogether.  This causes performance issues:
          // See RTC defect 95505.
          config.put("osgi.context.bootdelegation", "false");
  
          // Disable starting auto-start bundles during resolution.  This can cause deadlock if enabled
          config.put("osgi.module.auto.start.on.resolve", "false");
  
          // Disabling Equinox region MBean registration
          // See RTC defect 119657
          config.put("org.eclipse.equinox.region.register.mbeans", "false");
  
          // some blueprint configuration
          config.put("org.apache.aries.blueprint.use.system.context", "true");
          config.put("org.apache.aries.blueprint.parser.service.ignore.unknown.namespace.handlers", "true");
  
          config.put("ds.global.extender", "true");
      }