Arhn - архитектура программирования

Плагин Sonar, как сохранить нарушения

Я разрабатываю плагин сонара для анализа кода TrueScript с помощью tslint.

Я скачал пример плагина с [github.com/SonarSource/sonar-examples] и отредактировал ExampleSensor.java [github.com/SonarSource/sonar-examples/tree/master/plugins/sonar-reference-plugin/src/main/java/ com/mycompany/sonar/reference/batch]. Теперь мой датчик выглядит как в этом файле

package com.mycompany.sonar.reference.batch;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Collection;

import org.apache.commons.io.IOUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.batch.Sensor;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.config.Settings;
import org.sonar.api.resources.Project;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.Violation;

import pl.sollers.utils.FileSearcher;

public class ExampleSensor implements Sensor {

        private static final Logger LOG = LoggerFactory.getLogger(ExampleSensor.class);

        private Settings settings;

        /**
         * Use of IoC to get Settings
         */
        public ExampleSensor(Settings settings) {
                this.settings = settings;
        }

        public boolean shouldExecuteOnProject(Project project) {
                // This sensor is executed only for ts project type
                return project.getLanguageKey().equals("js");
        }

        public void analyse(Project project, SensorContext sensorContext) {
                // getting all files for analyzing
                Collection<File> files = FileSearcher.getByExtensionRecursively("ts");

                Process tslintProces;
                JSONParser jsonParser = new JSONParser();
                JSONArray warnings;
                Object jsonObj;

                for (File file : files) {
                        try {
                                // run tslint process and analyze file
                                tslintProces = new ProcessBuilder("tslint.cmd", "-c", "./tslint.json", "-t",
                                                "json", "-f", file.getCanonicalPath()).start();

                                // copy tslint output
                                StringWriter writer = new StringWriter();
                                IOUtils.copy(tslintProces.getInputStream(), writer, "UTF-8");
                                String json = writer.toString();

                                // parse output and extract violation message, ruleName, line
                                jsonObj = jsonParser.parse(json);
                                if (jsonObj instanceof JSONArray) {
                                        warnings = (JSONArray) (jsonObj);
                                } else {
                                        throw new Exception("Oczekiwano obiektu klasy JSONArray");
                                }

                                for (int i = 0; i < warnings.size(); i++) {
                                        JSONObject warning = (JSONObject) warnings.get(i);

                                        String message = (String) warning.get("failure");
                                        String ruleName = (String) warning.get("ruleName");

                                        JSONObject position = (JSONObject) warning.get("startPosition");
                                        Long line = (Long) position.get("line");
                                        // nie widzę pola w Sonarze aby użyć numeru znaku w linii
                                        Long character = (Long) position.get("character");

                                        // HELP! I DO NOT KNOW HOW TO STORE VIOLATION IN SONAR
                                        // FOLLOWING LINES DOES NOT WORK
                                        // Rule rule = Rule.create("repositoryKey",
                                                        String.format("%s-%s", "key", ruleName), ruleName);
                                        // org.sonar.api.resources.File resource = new org.sonar.api.resources.File(file
                                                        .getParentFile().getCanonicalPath(), file.getName());

                                        // Violation violation = Violation.create(rule, resource);
                                        // violation.setLineId(line.intValue());
                                        // violation.setMessage(message);
                                        // sensorContext.saveViolation(violation);
                                }
                        } catch (IOException e) {
                                LOG.error(e.getMessage());
                                e.printStackTrace();
                        } catch (ParseException e) {
                                LOG.error(e.getMessage());
                                e.printStackTrace();
                        } catch (Exception e) {
                                LOG.error(e.getMessage());
                        }
                }
        }

        @Override
        public String toString() {
                return getClass().getSimpleName();
        }
}

У меня проблема с сохранением нарушений в базе данных Sonar. Эта часть кода должна быть в строках 80-90. Может ли кто-нибудь помочь мне сохранить нарушения.

04.04.2014

Ответы:


1

Вы должны использовать Issueable, а не нарушения (потому что он устарел и будет удален в версии 4.3).

 import org.sonar.api.component.ResourcePerspectives;
 public class MySensor extends Sensor {
   private final ResourcePerspectives perspectives;

   public MySensor(ResourcePerspectives p) {
     this.perspectives = p;
   }

   public void analyse(Project project, SensorContext context) {
     Resource myResource; // to be set
     Issuable issuable = perspectives.as(Issuable.class, myResource);
     if (issuable != null) {
       // can be used
       Issue issue = issuable.newIssueBuilder()
         .setRuleKey(RuleKey.of("pmd", "AvoidArrayLoops")
         .setLine(10)
         .build();
       issuable.addIssue(issue);
     }
   }
 }
07.04.2014
  • Я пытаюсь реализовать это решение, но застреваю в строке «Issuable issuable =spectives.as(Issuable.class, myResource);» Метод так же возвращает null и я не знаю почему. myResource — это объект org.sonar.api.resources.File. Я получаю это от org.sonar.api.resources.File.fromIOFile(файл, проект); 08.04.2014
  • Я пытаюсь реализовать это решение, но я застрял в строке Issuable issuable = perspectives.as(Issuable.class, myResource);, где issuable имеет значение null. Откуда взялся мой ресурс? List<InputFile> inputFiles = project.getFileSystem().mainFiles("ts"); for (InputFile inputFile : inputFiles) { org.sonar.api.resources.File myResource = org.sonar.api.resources.File.fromIOFile(inputFile.getFile(), project); Issuable issuable = perspectives.as(Issuable.class, myResource); // issuable == null } Любая идея, почему isuable имеет значение null? 08.04.2014
  • Я думаю, что ресурс должен быть проиндексирован в первую очередь. Возможно, вам следует вызвать метод SensorContext.index(...), прежде чем обращаться к myResource. Это обходной путь, потому что в документах API говорится, что он будет индексироваться автоматически, начиная с SQ 4.2. 08.04.2014
  • В 4.2 произошли большие изменения. Вы должны сначала прочитать это. Проверьте версию API, которую вы используете в своем pom.xml. fromIOFile может вернуть null. Подробности и пример кода см. по ссылке. 08.04.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..