@Override
  public void configure(ProjectConfigurationRequest request, IProgressMonitor monitor) {
    Collection<IFile> filesToAnalyze =
        request.getFilesToAnalyze().stream().filter(fileValidator).collect(Collectors.toList());

    try {
      Path jsonPath = configureCProject(request.getProject(), filesToAnalyze, jsonFactory);
      core.debug("Wrote build info to: " + jsonPath.toString());
      request.getSonarProjectProperties().put(CFAMILY_USE_CACHE, Boolean.FALSE.toString());
      request
          .getSonarProjectProperties()
          .put(BUILD_WRAPPER_OUTPUT_PROP, jsonPath.getParent().toString());
    } catch (Exception e) {
      core.error(e.getMessage(), e);
    }
  }
 @Override
 public IContentProposal[] getProposals(String contents, int position) {
   if (!server.isStorageUpdated()) {
     parentPage.setMessage(
         "Please refresh project list from server first", IMessageProvider.INFORMATION);
     return new IContentProposal[0];
   }
   List<IContentProposal> list = new ArrayList<>();
   try {
     List<RemoteModule> modules = getModuleIndex().search(contents);
     for (RemoteModule m : modules) {
       RemoteSonarProject prj = new RemoteSonarProject(server.getId(), m.getKey(), m.getName());
       list.add(new ContentProposal(prj.asString(), m.getName(), prj.getDescription()));
     }
   } catch (Exception e) {
     SonarLintCorePlugin.getDefault()
         .debug("Unable to search modules from server " + server.getId(), e);
   }
   if (!list.isEmpty()) {
     parentPage.setMessage("", IMessageProvider.NONE);
     return list.toArray(new IContentProposal[list.size()]);
   } else {
     parentPage.setMessage("No results", IMessageProvider.INFORMATION);
     return new IContentProposal[0];
   }
 }
 public CProjectConfigurator() {
   this(
       new BuildWrapperJsonFactory(),
       CCorePlugin.getDefault(),
       CoreModel::isTranslationUnit,
       SonarLintCorePlugin.getDefault(),
       new FilePathResolver());
 }
  @Override
  protected IStatus run(SonarRunnerFacade runner, final IProgressMonitor monitor) {

    // Configure
    Properties properties = configureAnalysis(monitor, extraProps);

    // Analyze
    Collection<File> tmpToDelete = new ArrayList<>();
    try {
      if (request.getOnlyOnFiles() != null) {
        IProject project = request.getProject();
        final File baseDir = project.getLocation().toFile();
        handleLinkedFiles(tmpToDelete, baseDir);
      }
      run(request.getProject(), properties, runner, monitor);
      analysisCompleted(properties, monitor);
    } catch (Exception e) {
      SonarLintCorePlugin.getDefault()
          .error("Error during execution of SonarLint analysis" + System.lineSeparator(), e);
      return new Status(
          Status.WARNING,
          SonarLintCorePlugin.PLUGIN_ID,
          "Error when executing SonarLint analysis",
          e);
    } finally {
      for (File f : tmpToDelete) {
        try {
          f.delete();
        } catch (Exception e) {
          SonarLintCorePlugin.getDefault()
              .error("Unable to delete temporary file" + System.lineSeparator(), e);
        }
      }
    }
    if (monitor.isCanceled()) {
      return Status.CANCEL_STATUS;
    }

    return Status.OK_STATUS;
  }
 private void handleLinkedFiles(Collection<File> tmpToDelete, final File baseDir) {
   // Handle linked files
   for (IFile file : request.getOnlyOnFiles()) {
     if (file.isLinked()) {
       File tmp = new File(baseDir, file.getProjectRelativePath().toString());
       SonarLintCorePlugin.getDefault()
           .debug(
               file.getName()
                   + " is a linked resource. Will create a temporary copy"
                   + System.lineSeparator());
       try {
         Files.copy(file.getContents(), tmp.toPath());
         tmpToDelete.add(tmp);
       } catch (IOException | CoreException e) {
         SonarLintCorePlugin.getDefault()
             .error(
                 "Unable to create temporary copy for linked resource" + System.lineSeparator(),
                 e);
       }
     }
   }
 }
 private void loadProperties() {
   sonarProperties = new ArrayList<SonarLintProperty>();
   if (isGlobal()) {
     String props = getPreferenceStore().getString(PreferencesUtils.PREF_EXTRA_ARGS);
     try {
       String[] keyValuePairs = StringUtils.split(props, "\n\r");
       for (String keyValuePair : keyValuePairs) {
         String[] keyValue = StringUtils.split(keyValuePair, "=");
         sonarProperties.add(new SonarLintProperty(keyValue[0], keyValue[1]));
       }
     } catch (Exception e) {
       SonarLintCorePlugin.getDefault()
           .error("Error while loading SonarQube properties" + props, e);
     }
   } else {
     sonarProperties.addAll(getSonarProject().getExtraProperties());
   }
 }
  private Path configureCProject(
      IProject project, Collection<IFile> filesToAnalyze, BuildWrapperJsonFactory jsonFactory)
      throws IOException {
    Map<String, IScannerInfo> filesInfo = new HashMap<>();
    IScannerInfoProvider infoProvider = cCorePlugin.getScannerInfoProvider(project);

    for (IFile file : filesToAnalyze) {
      try {
        Path path = filePathResolver.getPath(file);
        IScannerInfo fileInfo = infoProvider.getScannerInformation(file);
        filesInfo.put(path.toString(), fileInfo);
      } catch (CoreException e) {
        core.error("Error building input file for SonarLint analysis: " + file.getName(), e);
      }
    }

    Path projectBaseDir = getProjectBaseDir(project);
    String json = jsonFactory.create(filesInfo, projectBaseDir.toString());

    return createJsonFile(filePathResolver.getWorkDir(), json);
  }
  public void run(
      IProject project,
      final Properties props,
      final SonarRunnerFacade runner,
      final IProgressMonitor monitor) {
    if (SonarLintCorePlugin.getDefault().isDebugEnabled()) {
      SonarLintCorePlugin.getDefault()
          .info("Start sonar-runner with args:\n" + propsToString(props) + System.lineSeparator());
    }
    Thread.UncaughtExceptionHandler h =
        new Thread.UncaughtExceptionHandler() {
          @Override
          public void uncaughtException(Thread th, Throwable ex) {
            SonarLintCorePlugin.getDefault()
                .error("Error during analysis" + System.lineSeparator(), ex);
          }
        };
    Thread t =
        new Thread("SonarLint analysis") {
          @Override
          public void run() {
            runner.startAnalysis(
                props,
                new IssueListener() {

                  @Override
                  public void handle(Issue issue) {
                    IResource r =
                        ResourceUtils.findResource(request.getProject(), issue.getComponentKey());
                    if (request.getOnlyOnFiles() == null || request.getOnlyOnFiles().contains(r)) {
                      try {
                        SonarMarker.create(r, issue);
                      } catch (CoreException e) {
                        SonarLintCorePlugin.getDefault().error(e.getMessage(), e);
                      }
                    }
                  }
                });
          }
        };
    t.setDaemon(true);
    t.setUncaughtExceptionHandler(h);
    t.start();
    while (t.isAlive()) {
      if (monitor.isCanceled()) {
        t.interrupt();
        try {
          t.join(5000);
        } catch (InterruptedException e) {
          // just quit
        }
        if (t.isAlive()) {
          SonarLintCorePlugin.getDefault().error("Unable to properly terminate SonarLint analysis");
        }
        break;
      }
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        // Here we don't care
      }
    }
  }