[слово предостережения: имена 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
? Если да, то что? Если нет, что мне нужно изменить и как?
Дикое предположение: 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