2015-11-12 6 views
1

[слово предостережения: имена mangled; это закрытый источник, но я показываю как можно больше кода, чтобы выделить логику. . Извините за что]Как заменить этот код на не устаревший код в плагине языка SonarQube (5.1.x)?

Я задал этот вопрос в списке рассылки разработчиков SonarQube, но безрезультатно до сих пор ...

Вот код (имена несколько исковерканные):

public final class MyProfile 
    extends ProfileDefinition 
{ 
    // RuleFinder is DEPRECATED 
    private final RuleFinder finder; 

    public MyProfile(final RuleFinder finder) 
    { 
     this.finder = finder; 
    } 

    @Override 
    public RulesProfile createProfile(final ValidationMessages validation) 
    { 
     @SuppressWarnings("rawtypes") 
     final List<Class> checks = MyChecks.all(); 

     return new AnnotationBasedProfileBuilder(finder).build(
      PluginConstants.REPOSITORY_KEY, 
      PluginConstants.DEFAULT_QUALITY_PROFILE, 
      PluginConstants.LANGUAGE_KEY, 
      checks, 
      validation 
     ); 
    } 
} 

Это код зарегистрирован как компонент плагина SonarQube (используя SonarPlugin # getExtensions()); его эффект заключается в создании профиля качества для языка, определенного PluginConstants.LANGUAGE_KEY с именем PluginConstants.DEFAULT_QUALITY_PROFILE для всех правил, определенных в PluginConstants.REPOSITORY_KEY.

И здесь начинается проблема.

Прежде всего, MyChecks.all(): MyChecks это:

public final class MyChecks 
{ 
    private static final List<Class<? extends MyCheck>> NOARG_CHECKS; 
    private static final List<Class<? extends MyCheck>> ARG_CHECKS; 

    static { 
     List<Class<? extends MyCheck>> list; 

     list = new ArrayList<>(); 

     // add implementations of MyCheck here 

     NOARG_CHECKS = Collections.unmodifiableList(list); 

     list = new ArrayList<>(); 

     // add other implementations of MyCheck here, but with IOC dependecies 

     ARG_CHECKS = Collections.unmodifiableList(list); 
    } 

    private MyChecks() 
    { 
     throw new Error("nice try!"); 
    } 

    @SuppressWarnings("rawtypes") 
    public static List<Class> all() 
    { 
     final List<Class> list = new ArrayList<>(); 
     list.addAll(NOARG_CHECKS); 
     list.addAll(ARG_CHECKS); 
     return Collections.unmodifiableList(list); 
    } 

    @SuppressWarnings({ "ReturnOfCollectionOrArrayField", "rawtypes" }) 
    public static Collection noargChecks() 
    { 
     return NOARG_CHECKS; 
    } 

    @SuppressWarnings("rawtypes") 
    public static Collection argChecks(final Settings settings) 
    { 
     final List<MyCheck> list = new ArrayList<>(); 

     // add here checks whose constructors depend on "settings" 

     return Collections.unmodifiableList(list); 
    } 
} 

Нет отношения к любому PluginConstants.* до сих пор, не так ли? Ну, вот он приходит ...

У меня есть это:

public final class MyRulesDefinition 
    implements RulesDefinition 
{ 
    @Override 
    public void define(final Context context) 
    { 

     @SuppressWarnings("rawtypes") 
     final List<Class> list = MyChecks.all(); 

     // SonarConstans.DEFAULT_RULE_REPOSITORY is "SonarQube"; 
     // it is not used in _any other place_ than here 
     final NewRepository repo = context.createRepository(
      PluginConstants.REPOSITORY_KEY, 
      PluginConstants.LANGUAGE_KEY 
     ).setName(SonarConstants.DEFAULT_RULE_REPOSITORY); 

     AnnotationBasedRulesDefinition.load(repo, PluginConstants.LANGUAGE_KEY, 
      list); 

     repo.done(); 
    } 
} 

Мы находим назад как REPOSITORY_KEY и LANGUAGE_KEY здесь.

Если бы это были все, что было для этого, это было бы не весело, правда? Хорошо, давайте продолжим!

Теперь мы приходим к датчику языка:

public final class MySquidSensor 
    implements Sensor 
{ 
    // HERE 
    private final Checks<MyCheck> checks; 

    /* 
    * Yes, unfortunately, Sonar has "taken over" a name used by the JDK here. 
    */ 
    private final org.sonar.api.batch.fs.FileSystem fs; 

    private final FilePredicate predicate; 
    private final ResourcePerspectives perspectives; 
    private final Settings settings; 

    public MySquidSensor(final org.sonar.api.batch.fs.FileSystem fs, 
     final CheckFactory checkFactory, 
     final ResourcePerspectives perspectives, 
     final Settings settings) 
    { 
     this.settings = settings; 
     this.fs = fs; 
     this.perspectives = perspectives; 

     predicate = fs.predicates().hasLanguage(PluginConstants.LANGUAGE_KEY); 

     // HERE 
     checks = checkFactory. 
      <MyCheck>create(PluginConstants.REPOSITORY_KEY) 
      .addAnnotatedChecks(MyChecks.noargChecks()) 
      .addAnnotatedChecks(MyChecks.argChecks(settings)); 
    } 

    // some other, irrelevant code 
} 

И здесь мы снова находим REPOSITORY_KEY. И обратите внимание на вызов методов .noArgChecks() и .argChecks()MyChecks.


Хорошо, хорошо, что было много кода, но мой вопрос очень прост, хотя ответ не может быть: RuleFinder устарела; как преобразовать этот код, чтобы я не использовал его? Нужно ли мне изменить мою реализацию ProfileDefinition? Если да, то что? Если нет, что мне нужно изменить и как?

+0

Дикое предположение: Reimplement ['AnnotationBasedProfileBuilder'] (https://github.com/SonarSource/sslr-squid-bridge/blob/master/src/main/java/org/sonar/squidbridge/annotations/AnnotationBasedProfileBuilder. java) с помощью ['Rules'] (https://github.com/SonarSource/sonarqube/blob/master/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/Rules.java) вместо искателя. Это единственное место, где я вижу, что он используется. – zapl

ответ

0

В интересах любого, кто приходит сюда через google - в соответствии с этим сообщением в список рассылки разработчиков (в ответ на @fge) RuleFinder в настоящее время не рекомендуется для компонентов на стороне сервера, только для пакетных.

http://sonarqube-archive.15.x6.nabble.com/sonar-dev-RulesFinder-is-deprecated-but-what-replaces-it-td5035167.html

Так код с помощью RuleFinder не является устаревшим.