String[] argv = project.getJarFileArray(); progressCallback.reportNumberOfArchives(argv.length);
  public void execute() throws java.io.IOException, InterruptedException {	// Configure the analysis context	AnalysisContext analysisContext = AnalysisContext.instance();	analysisContext.setLookupFailureCallback(bugReporter);	analysisContext.setSourcePath(project.getSourceDirList());	// Create detectors, if required	if (detectors == null)		createDetectors();	// Clear repository and analysis context cache of all class files	clearRepository();	// Scan all jar files and directories,	// making a list of all classes encountered.	// We also keep track of all resources referenced by	// Class-Path entries in the manifests of scanned jar	// files, in order to add them to the auxiliary classpath	// when the analysis is performed.	String[] argv = project.getJarFileArray();	progressCallback.reportNumberOfArchives(argv.length);	List<String> repositoryClassList = new LinkedList<String>();	List<String> manifestClassPathEntryList = new LinkedList<String>();	for (int i = 0; i < argv.length; i++)		addFileToRepository(argv[i], repositoryClassList, manifestClassPathEntryList);	// Set the classpath to be used for class lookups.	setClasspath(manifestClassPathEntryList);	// Examine all classes for bugs.	// Don't examine the same class more than once.	// (The user might specify two jar files that contain	// the same class.)	progressCallback.startAnalysis(repositoryClassList.size());	Set<String> examinedClassSet = new HashSet<String>();	for (Iterator<String> i = repositoryClassList.iterator(); i.hasNext(); ) {		String className = i.next();		if (examinedClassSet.add(className))			examineClass(className);		}	progressCallback.finishPerClassAnalysis();	this.reportFinal();	// Flush any queued bug reports	bugReporter.finish();	// Flush any queued error reports	bugReporter.reportQueuedErrors();  }