docs: public void run() {
  
          if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.FINER)) {
              logger.logp(Level.FINER, CLASS_NAME, "run", "enter");
          }
  
          String docRoot = null, threadParam = null;
  
          Container container = webapp.getModuleContainer();
          if (container != null) {
              hasContainer = true;
          } else {
              docRoot = webapp.getRealPath("/");
          }
          /*
           * First we gather information about the webapp and the parameters that
           * were specified.
           */
          //appName = webapp.getWebAppName();
          appName = webapp.getWebAppConfig().getApplicationName();
  
          //Get the maximum length of the files that we will only compile.... the rest are also classloaded
          _minLength = options.getPrepareJSPs() * 1024;
  
          if (options.getPrepareJSPsClassloadChanged() != null) {
              onlyCLChanged = true;
              _startAt = Constants.PREPARE_JSPS_DEFAULT_STARTAT;
          } else {
              _startAt = options.getPrepareJSPsClassload();
          }
  
          _threads = options.getPrepareJSPThreadCount();
  
          if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled()) {
              logger.logp(Level.INFO, CLASS_NAME, "run", "PrepareJspHelper executing on application [" + this.appName + "]");
          }
  
          if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.FINE)) {
              logger.logp(Level.FINE, CLASS_NAME, "run", "PrepareJspHelper: Document Root: " + docRoot);
              logger.logp(Level.FINE, CLASS_NAME, "run", "PrepareJspHelper: File size minimum (in bytes): " + _minLength);
              logger.logp(Level.FINE, CLASS_NAME, "run", "PrepareJspHelper: Number of threads: " + _threads);
  
              if (onlyCLChanged) {
                  logger.logp(Level.FINE, CLASS_NAME, "run", "PrepareJspHelper: Only classloading out-of-date (changed) JSPs.");
              } else {
                  logger.logp(Level.FINE, CLASS_NAME, "run", "PrepareJspHelper: Classloading JSPs starting at JSP number " + _startAt);
              }
  
          }
  
          if (container != null) {
              createListOfEntries(container);
          }
  
          //Create worker threads and let them start compiling.
          try {
              Thread[] threads = new Thread[_threads];
              int i;
              for (i = 0; i < _threads; i++) {
                  PrepareJspHelperThread helper = new PrepareJspHelperThread(this, docRoot, container);
                  threads[i] = new Thread(helper, "PrepareJspHelperThread " + i);
                  threads[i].setDaemon(true);
                  threads[i].start();
              }
              //now lets wait for all the threads to die.
              for (i = 0; i < _threads; i++) {
                  try {
                      threads[i].join();
                  } catch (Throwable th) {
                      if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.WARNING)) {
                          logger.logp(Level.WARNING, CLASS_NAME, "run", "Pretouch Thread died during execution.", th);
                      }
                  }
              }
          } catch (Exception ex) {
              logger.logp(Level.WARNING, CLASS_NAME, "run", "Unexpected exception while running pretouch.", ex);
          }
  
          if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.INFO)) {
              logger.logp(Level.INFO, CLASS_NAME, "run", "PrepareJspHelper in group [" + appName + "]: All " + _counter + " jsp files have been processed.");
          }
  
          if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.FINER)) {
              logger.logp(Level.FINER, CLASS_NAME, "run", "< run");
          }
      }