private static boolean classesArePresentInCoverageData(
     ProjectData data, Set<String> qualifiedNames) {
   for (String qualifiedName : qualifiedNames) {
     if (data.getClassData(qualifiedName) != null) {
       return true;
     }
   }
   return false;
 }
 private static @Nullable ClassData getClassData(
     final @NotNull String filePath,
     final @NotNull ProjectData data,
     final @NotNull Map<String, String> normalizedFiles2Files) {
   final String originalFileName = normalizedFiles2Files.get(filePath);
   if (originalFileName == null) {
     return null;
   }
   return data.getClassData(originalFileName);
 }
 public void selectSubCoverage(
     @NotNull final CoverageSuitesBundle suite, final List<String> testNames) {
   suite.restoreCoverageData();
   final ProjectData data = suite.getCoverageData();
   if (data == null) return;
   mySubCoverageIsActive = true;
   final Map<String, Set<Integer>> executionTrace = new HashMap<String, Set<Integer>>();
   for (CoverageSuite coverageSuite : suite.getSuites()) {
     final String fileName = coverageSuite.getCoverageDataFileName();
     final File tracesDir = getTracesDirectory(fileName);
     for (String testName : testNames) {
       final File file = new File(tracesDir, FileUtil.sanitizeFileName(testName) + ".tr");
       if (file.exists()) {
         DataInputStream in = null;
         try {
           in = new DataInputStream(new FileInputStream(file));
           int traceSize = in.readInt();
           for (int i = 0; i < traceSize; i++) {
             final String className = in.readUTF();
             final int linesSize = in.readInt();
             Set<Integer> lines = executionTrace.get(className);
             if (lines == null) {
               lines = new HashSet<Integer>();
               executionTrace.put(className, lines);
             }
             for (int l = 0; l < linesSize; l++) {
               lines.add(in.readInt());
             }
           }
         } catch (Exception e) {
           LOG.error(e);
         } finally {
           try {
             in.close();
           } catch (IOException e) {
             LOG.error(e);
           }
         }
       }
     }
   }
   final ProjectData projectData = new ProjectData();
   for (String className : executionTrace.keySet()) {
     ClassData loadedClassData = projectData.getClassData(className);
     if (loadedClassData == null) {
       loadedClassData = projectData.getOrCreateClassData(className);
     }
     final Set<Integer> lineNumbers = executionTrace.get(className);
     final ClassData oldData = data.getClassData(className);
     LOG.assertTrue(oldData != null, "missed className: \"" + className + "\"");
     final Object[] oldLines = oldData.getLines();
     LOG.assertTrue(oldLines != null);
     int maxNumber = oldLines.length;
     for (Integer lineNumber : lineNumbers) {
       if (lineNumber >= maxNumber) {
         maxNumber = lineNumber + 1;
       }
     }
     final LineData[] lines = new LineData[maxNumber];
     for (Integer line : lineNumbers) {
       final int lineIdx = line.intValue() - 1;
       String methodSig = null;
       if (lineIdx < oldData.getLines().length) {
         final LineData oldLineData = oldData.getLineData(lineIdx);
         if (oldLineData != null) {
           methodSig = oldLineData.getMethodSignature();
         }
       }
       final LineData lineData = new LineData(lineIdx, methodSig);
       if (methodSig != null) {
         loadedClassData.registerMethodSignature(lineData);
       }
       lineData.setStatus(LineCoverage.FULL);
       lines[lineIdx] = lineData;
     }
     loadedClassData.setLines(lines);
   }
   suite.setCoverageData(projectData);
   renewCoverageData(suite);
 }