docs: private void processWorkList(IClassPath classPath, LinkedList<WorkListItem> workList, IClassPathBuilderProgress progress)
              throws InterruptedException, IOException, ResourceNotFoundException {
          // Build the classpath, scanning codebases for nested archives
          // and referenced codebases.
          while (!workList.isEmpty()) {
              WorkListItem item = workList.removeFirst();
              if (item.getHowDiscovered() == ICodeBase.Discovered.SPECIFIED) {
                  progress.startArchive(item.toString());
              }
              if (DEBUG) {
                  System.out.println("Working: " + item.getCodeBaseLocator());
              }
  
              DiscoveredCodeBase discoveredCodeBase;
  
              // See if we have encountered this codebase before
              discoveredCodeBase = discoveredCodeBaseMap.get(item.getCodeBaseLocator().toString());
              if (discoveredCodeBase != null) {
                  // If the codebase is not an app codebase and
                  // the worklist item says that it is an app codebase,
                  // change it. Otherwise, we have nothing to do.
                  if (!discoveredCodeBase.getCodeBase().isApplicationCodeBase() && item.isAppCodeBase()) {
                      discoveredCodeBase.getCodeBase().setApplicationCodeBase(true);
                  }
  
                  continue;
              }
  
              // Detect .java files, which are probably human error
              if (item.getCodeBaseLocator() instanceof FilesystemCodeBaseLocator) {
                  FilesystemCodeBaseLocator l = (FilesystemCodeBaseLocator) item.getCodeBaseLocator();
                  if (l.getPathName().endsWith(".java")) {
                      if (DEBUG){
                          System.err.println("Ignoring .java file \"" + l.getPathName() + "\" specified in classpath or auxclasspath");
                      }
                      continue;
                  }
              }
  
              // If we are working on an application codebase,
              // then failing to open/scan it is a fatal error.
              // We issue warnings about problems with aux codebases,
              // but continue anyway.
  
              try {
                  // Open the codebase and add it to the classpath
                  discoveredCodeBase = new DiscoveredCodeBase(item.getCodeBaseLocator().openCodeBase());
                  discoveredCodeBase.getCodeBase().setApplicationCodeBase(item.isAppCodeBase());
                  discoveredCodeBase.getCodeBase().setHowDiscovered(item.getHowDiscovered());
  
                  // Note that this codebase has been visited
                  discoveredCodeBaseMap.put(item.getCodeBaseLocator().toString(), discoveredCodeBase);
                  discoveredCodeBaseList.addLast(discoveredCodeBase);
  
                  // If it is a scannable codebase, check it for nested archives.
                  // In addition, if it is an application codebase then
                  // make a list of application classes.
                  if (discoveredCodeBase.getCodeBase() instanceof IScannableCodeBase
                          && ( discoveredCodeBase.codeBase.isApplicationCodeBase()
                                  || item.getHowDiscovered() == ICodeBase.Discovered.SPECIFIED)
                          ) {
                      scanCodebase(classPath, workList, discoveredCodeBase);
                  }
  
                  // Check for a Jar manifest for additional aux classpath
                  // entries.
                  scanJarManifestForClassPathEntries(workList, discoveredCodeBase.getCodeBase());
              } catch (IOException e) {
                  if (item.isAppCodeBase() || item.getHowDiscovered() == ICodeBase.Discovered.SPECIFIED) {
                      if (e instanceof FileNotFoundException) {
                          if(item.isAppCodeBase()){
                              errorLogger.logError("File from project not found: " + item.getCodeBaseLocator(), e);
                          } else {
                              errorLogger.logError("File from auxiliary classpath not found: " + item.getCodeBaseLocator(), e);
                          }
                      } else {
                          errorLogger.logError("Cannot open codebase " + item.getCodeBaseLocator(), e);
                      }
                  }
              } catch (ResourceNotFoundException e) {
                  if (item.getHowDiscovered() == ICodeBase.Discovered.SPECIFIED) {
                      errorLogger.logError("Cannot open codebase " + item.getCodeBaseLocator(), e);
                  }
              }
  
              if (item.getHowDiscovered() == ICodeBase.Discovered.SPECIFIED) {
                  progress.finishArchive();
              }
          }
      }