public MyRunProfile(RunConfigurationBase configuration) {
   super(
       configuration.getProject(),
       configuration.getFactory(),
       ActionsBundle.message("action.RerunFailedTests.text"));
   myConfiguration = configuration;
 }
  private static void processAvailableTraces(RunConfigurationBase configuration) {
    final String tracesDirectory = getTracesDirectory(configuration);
    final TestDiscoveryIndex coverageIndex =
        TestDiscoveryIndex.getInstance(configuration.getProject());
    synchronized (ourTracesLock) {
      final File tracesDirectoryFile = new File(tracesDirectory);
      final File[] testMethodTraces =
          tracesDirectoryFile.listFiles(
              new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                  return name.endsWith(".tr");
                }
              });
      if (testMethodTraces != null) {
        for (File testMethodTrace : testMethodTraces) {
          try {
            coverageIndex.updateFromTestTrace(testMethodTrace);
            FileUtil.delete(testMethodTrace);
          } catch (IOException e) {
            LOG.error("Can not load " + testMethodTrace, e);
          }
        }

        final String[] filesInTracedDirectories = tracesDirectoryFile.list();
        if (filesInTracedDirectories == null || filesInTracedDirectories.length == 0) {
          FileUtil.delete(tracesDirectoryFile);
        }
      }
    }
  }
  @Override
  protected void attachToProcess(
      @NotNull final RunConfigurationBase configuration,
      @NotNull final ProcessHandler handler,
      @Nullable RunnerSettings runnerSettings) {
    if (runnerSettings == null && isApplicableFor(configuration)) {
      final Alarm processTracesAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, null);
      final MessageBusConnection connection = configuration.getProject().getMessageBus().connect();
      connection.subscribe(
          SMTRunnerEventsListener.TEST_STATUS,
          new SMTRunnerEventsAdapter() {
            private List<String> myCompletedMethodNames = new ArrayList<String>();

            @Override
            public void onTestFinished(@NotNull SMTestProxy test) {
              final SMTestProxy.SMRootTestProxy root = test.getRoot();
              if ((root == null || root.getHandler() == handler)) {
                final String fullTestName = test.getLocationUrl();
                if (fullTestName != null
                    && fullTestName.startsWith(JavaTestLocator.TEST_PROTOCOL)) {
                  myCompletedMethodNames.add(
                      ((JavaTestConfigurationBase) configuration).getFrameworkPrefix()
                          + fullTestName.substring(JavaTestLocator.TEST_PROTOCOL.length() + 3));
                  if (myCompletedMethodNames.size() > 50) {
                    final String[] fullTestNames = ArrayUtil.toStringArray(myCompletedMethodNames);
                    myCompletedMethodNames.clear();
                    processTracesAlarm.addRequest(
                        new Runnable() {
                          @Override
                          public void run() {
                            processAvailableTraces(configuration, fullTestNames);
                          }
                        },
                        100);
                  }
                }
              }
            }

            @Override
            public void onTestingFinished(@NotNull SMTestProxy.SMRootTestProxy testsRoot) {
              if (testsRoot.getHandler() == handler) {
                processTracesAlarm.cancelAllRequests();
                processTracesAlarm.addRequest(
                    new Runnable() {
                      @Override
                      public void run() {
                        processAvailableTraces(configuration);
                        Disposer.dispose(processTracesAlarm);
                      }
                    },
                    0);
                connection.disconnect();
              }
            }
          });
    }
  }
 public static void processGatheredCoverage(RunConfigurationBase configuration) {
   final Project project = configuration.getProject();
   if (project.isDisposed()) return;
   final CoverageDataManager coverageDataManager = CoverageDataManager.getInstance(project);
   final CoverageEnabledConfiguration coverageEnabledConfiguration =
       CoverageEnabledConfiguration.getOrCreate(configuration);
   //noinspection ConstantConditions
   final CoverageSuite coverageSuite = coverageEnabledConfiguration.getCurrentCoverageSuite();
   if (coverageSuite != null) {
     ((BaseCoverageSuite) coverageSuite).setConfiguration(configuration);
     coverageDataManager.coverageGathered(coverageSuite);
   }
 }
 private static void processAvailableTraces(
     RunConfigurationBase configuration, String[] fullTestNames) {
   final String tracesDirectory = getTracesDirectory(configuration);
   final TestDiscoveryIndex coverageIndex =
       TestDiscoveryIndex.getInstance(configuration.getProject());
   synchronized (ourTracesLock) {
     for (String fullTestName : fullTestNames) {
       final String className = StringUtil.getPackageName(fullTestName);
       final String methodName = StringUtil.getShortName(fullTestName);
       if (!StringUtil.isEmptyOrSpaces(className) && !StringUtil.isEmptyOrSpaces(methodName)) {
         final File testMethodTrace =
             new File(tracesDirectory, className + "-" + methodName + ".tr");
         if (testMethodTrace.exists()) {
           try {
             coverageIndex.updateFromTestTrace(testMethodTrace);
             FileUtil.delete(testMethodTrace);
           } catch (IOException e) {
             LOG.error("Can not load " + testMethodTrace, e);
           }
         }
       }
     }
   }
 }
 @Override
 public RunConfiguration clone() {
   return myConfiguration.clone();
 }
 @Override
 public SettingsEditor<ConfigurationPerRunnerSettings> getRunnerSettingsEditor(
     final ProgramRunner runner) {
   return myConfiguration.getRunnerSettingsEditor(runner);
 }
 @Override
 public ConfigurationPerRunnerSettings createRunnerSettings(
     final ConfigurationInfoProvider provider) {
   return myConfiguration.createRunnerSettings(provider);
 }
 @Override
 @NotNull
 public ConfigurationType getType() {
   return myConfiguration.getType();
 }
 @Override
 @NotNull
 public SettingsEditor<? extends RunConfiguration> getConfigurationEditor() {
   return myConfiguration.getConfigurationEditor();
 }
 @NotNull
 private static String getTracesDirectory(RunConfigurationBase configuration) {
   return baseTestDiscoveryPathForProject(configuration.getProject())
       + File.separator
       + configuration.getUniqueID();
 }
 @Override
 public ArrayList<PredefinedLogFile> getPredefinedLogFiles() {
   return myConfiguration.getPredefinedLogFiles();
 }
 @Override
 public void writeExternal(Element element) throws WriteExternalException {
   super.writeExternal(element);
   String executable = myRunnerParameters != null ? myRunnerParameters.getExecutableName() : null;
   if (executable != null) element.setAttribute(EXECUTABLE_NAME, executable);
 }
 @Override
 public void readExternal(Element element) throws InvalidDataException {
   super.readExternal(element);
   myRunnerParameters = createRunnerParameters();
   myRunnerParameters.setExecutableName(element.getAttributeValue(EXECUTABLE_NAME));
 }
 @Override
 public int getUniqueID() {
   return myConfiguration.getUniqueID();
 }
 @Override
 public LogFileOptions getOptionsForPredefinedLogFile(PredefinedLogFile predefinedLogFile) {
   return myConfiguration.getOptionsForPredefinedLogFile(predefinedLogFile);
 }
 /////////////////////////////////// Delegates
 @Override
 public void readExternal(final Element element) throws InvalidDataException {
   myConfiguration.readExternal(element);
 }
 @Override
 public ArrayList<LogFileOptions> getLogFiles() {
   return myConfiguration.getLogFiles();
 }
 @Override
 public void writeExternal(final Element element) throws WriteExternalException {
   myConfiguration.writeExternal(element);
 }