SonarQube получить свойство в RulesDefinition

Я пытаюсь получить доступ к Property в классе, расширяющем RulesDefinition моего плагина SonarQube. Я определяю это свойство в классе, расширяющем SonarPlugin, с помощью:

@Properties(
    @Property(key="sonar.root.path", name="Path to installation", description = "Root directory of the Master plugin installation directory")
)

свойство правильно создано, и я установил его значение на странице конфигурации SQ, но почему-то я не могу получить к нему доступ из класса, расширяющего RulesDefinition с помощью этого кода в переопределенном методе define(Context context):

// Get access to the Properties
Settings settings = new Settings(new PropertyDefinitions(new MyPlugin()));
if(settings.hasKey("sonar.root.path")) {
    // Never enters here
    String path = settings.getString("sonar.root.path");
} else {
    // If always returns false and enters here
    LOG.info("No property defined with the provided key.");
}

// To double-check
LOG.info("The value: " + settings.getString("sonar.root.path"));   // Returns null

LOG.info("Has default value: " + settings.hasDefaultValue("sonar.root.path"));    
// Returns false, or true if I provide a default value, proving it can
    // access the property - so the if condition above should have returned true

Странно то, что я проверил свойство через веб-службу REST и могу подтвердить, что показанные значения являются значениями, установленными на веб-странице, но если я укажу значение по умолчанию (как указано чуть выше), журнал показывает значение по умолчанию значение, а не значение, введенное на веб-странице (и отображаемое через веб-службу).

Возможно, проблема в том, как я получаю объект Settings. Был бы признателен за любую оказанную помощь. Заранее спасибо.


person jonypera    schedule 20.07.2016    source источник


Ответы (1)


Настройки компонента создаются ядром и должны быть внедрены в ваш объект через параметр конструктора:

public class YourRulesDefinition implements RulesDefinition {
  private final Settings settings;

  public YourRulesDefinition(Settings s) {
    this.settings = s;
  }

  void yourMethod() {
    if(settings.hasKey("sonar.root.path")) {
      // ...
    }
  }
}

Обратите внимание, что вы никогда не должны создавать экземпляры основных классов. Они всегда доступны через внедрение конструктора.

person Simon Brandhof - SonarSource    schedule 20.07.2016
comment
Спасибо за ваш ответ. Завтра попробую и отпишусь. У меня не было конструктора в этом классе, потому что мне это не нужно. Если я создам его, как вы предлагаете, движок SonarQube автоматически получит к нему доступ с помощью созданной информации, так ли это? Кроме того, должен ли я сохранить Propertydefinition в классе, расширяющем SonarPlugin? Спасибо. - person jonypera; 21.07.2016