[Question][Sonar Javascript] How to read property value on DoubleDispatchVisitorCheck based my check class?

83 views
Skip to first unread message

Salih Karahan

unread,
Jan 24, 2017, 7:53:25 AM1/24/17
to SonarQube
Hi,

I develop a plugin for my company. I put inputs on administration screen for options. Now, I need read values of properties in my exteded DoubleDispatchVisitorCheck class. I tried constructor injection but its don't work in runtime when i attached plugin to sonarqube 6.1. 
How to I do this?

Thanks.

Salih Karahan

unread,
Jan 24, 2017, 9:13:24 AM1/24/17
to SonarQube
if i pass a parameter in constructor 
(@Nullable Settings settings)
i have below exception in analysis process.

INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 2.100s
INFO: Final Memory: 42M/153M
ERROR: Error during SonarQube Scanner execution
java.lang.IllegalStateException: Fail to instantiate class class com.company.sonarqube.javascript.rule.ForbiddenKeywordDetectRule for rule Company.Custom.Javascript.Rule.Repository.Key:cmp.js.keywor
d-checker
        at org.sonar.api.batch.rule.Checks.failToInstantiateCheck(Checks.java:171)
        at org.sonar.api.batch.rule.Checks.instantiate(Checks.java:166)
        at org.sonar.api.batch.rule.Checks.addAnnotatedChecks(Checks.java:137)
        at org.sonar.plugins.javascript.JavaScriptChecks.addChecks(JavaScriptChecks.java:55)
        at org.sonar.plugins.javascript.JavaScriptChecks.addCustomChecks(JavaScriptChecks.java:64)
        at org.sonar.plugins.javascript.JavaScriptSquidSensor.<init>(JavaScriptSquidSensor.java:113)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
        at org.picocontainer.injectors.AbstractInjector.newInstance(AbstractInjector.java:145)
        at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:342)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
        at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
        at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
INFO: ------------------------------------------------------------------------
        at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
        at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
        at org.picocontainer.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:606)
        at org.picocontainer.DefaultPicoContainer.getComponents(DefaultPicoContainer.java:587)
        at org.sonar.core.platform.ComponentContainer.getComponentsByType(ComponentContainer.java:281)
        at org.sonar.scanner.bootstrap.BatchExtensionDictionnary.completeBatchExtensions(BatchExtensionDictionnary.java:133)
        at org.sonar.scanner.bootstrap.BatchExtensionDictionnary.getExtensions(BatchExtensionDictionnary.java:128)
        at org.sonar.scanner.bootstrap.BatchExtensionDictionnary.getFilteredExtensions(BatchExtensionDictionnary.java:107)
        at org.sonar.scanner.bootstrap.BatchExtensionDictionnary.select(BatchExtensionDictionnary.java:74)
        at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:45)
        at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:78)
        at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:182)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127)
        at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:247)
        at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:242)
        at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:240)
        at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:232)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127)
        at org.sonar.scanner.task.ScanTask.execute(ScanTask.java:47)
        at org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:86)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127)
        at org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:115)
        at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:116)
        at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:62)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
        at com.sun.proxy.$Proxy0.execute(Unknown Source)
        at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:233)
        at org.sonarsource.scanner.api.EmbeddedScanner.runAnalysis(EmbeddedScanner.java:151)
        at org.sonarsource.scanner.cli.Main.runAnalysis(Main.java:110)
        at org.sonarsource.scanner.cli.Main.execute(Main.java:74)
        at org.sonarsource.scanner.cli.Main.main(Main.java:61)
Caused by: java.lang.InstantiationException: com.company.sonarqube.javascript.rule.ForbiddenKeywordDetectRule
        at java.lang.Class.newInstance(Class.java:427)
        at org.sonar.api.batch.rule.Checks.instantiate(Checks.java:161)
        ... 51 more
Caused by: java.lang.NoSuchMethodException: com.company.sonarqube.javascript.rule.ForbiddenKeywordDetectRule.<init>()
        at java.lang.Class.getConstructor0(Class.java:3082)
        at java.lang.Class.newInstance(Class.java:412)
        ... 52 more


Pierre-Yves Nicolas

unread,
Jan 24, 2017, 9:34:37 AM1/24/17
to Salih Karahan, SonarQube
Hi,

I don't think that's possible.
Could you add a parameter to the rule as in TooManyLinesInFileCheck?

Pierre-Yves

--
You received this message because you are subscribed to the Google Groups "SonarQube" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sonarqube+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/sonarqube/889fda26-9eef-4e19-8fa5-7eaf02e71305%40googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Salih Karahan

unread,
Jan 24, 2017, 10:17:42 AM1/24/17
to SonarQube, slhka...@gmail.com
My constructor of class is below. I can't implement with your suggested way because i think the @RuleKey annotation don't related this usage. 

public ForbiddenKeywordDetectRule(@Nullable Settings settings) {
Logger.Info.Log("ATTENTION ForbiddenKeywordDetectRule constructor invoking..");
// this implements JavaScriptCheck
this._issues = new org.sonar.javascript.visitors.Issues(this);
String keywordPath = null;
if (settings == null) {
Logger.Info.Log("ATTENTION SETTINGS ARG IS NULL");
Logger.Info.Log("DEFAULT PATH :" + KeywordSettings.KEYWORD_FILE_DEFAULT_VALUE);
keywordPath = KeywordSettings.KEYWORD_FILE_DEFAULT_VALUE;
} else {
Logger.Info.Log("ATTENTION SETTINGS ARG EXIST");
Logger.Info.Log("OPTIONAL PATH :" + settings.getString(KeywordSettings.KEYWORD_FILE_KEY));
keywordPath = settings.getString(KeywordSettings.KEYWORD_FILE_KEY);
}

try {
Logger.Info.Log("ATTENTION SETTINGS PATH : " + keywordPath);
this._metadata = KeywordJsonParser.ParseForbiddenKeywords(keywordPath); // this line i read keyword-json file and gets in object
} catch (FileNotFoundException e) {
Logger.Info.Log(e);
e.printStackTrace();
} catch (IOException e) {
Logger.Info.Log(e);
e.printStackTrace();
}

this.InitializeRuleHandlers();
}



24 Ocak 2017 Salı 17:34:37 UTC+3 tarihinde Pierre-Yves Nicolas yazdı:
To unsubscribe from this group and stop receiving emails from it, send an email to sonarqube+...@googlegroups.com.


24 Ocak 2017 Salı 17:34:37 UTC+3 tarihinde Pierre-Yves Nicolas yazdı:
To unsubscribe from this group and stop receiving emails from it, send an email to sonarqube+...@googlegroups.com.


24 Ocak 2017 Salı 17:34:37 UTC+3 tarihinde Pierre-Yves Nicolas yazdı:
To unsubscribe from this group and stop receiving emails from it, send an email to sonarqube+...@googlegroups.com.


24 Ocak 2017 Salı 17:34:37 UTC+3 tarihinde Pierre-Yves Nicolas yazdı:
To unsubscribe from this group and stop receiving emails from it, send an email to sonarqube+...@googlegroups.com.

Pierre-Yves Nicolas

unread,
Jan 24, 2017, 11:02:00 AM1/24/17
to Salih Karahan, SonarQube
Which "@RuleKey"?
I gave you a link to a class which uses @RuleProperty: that way, you can define a rule parameter.
This parameter can be modified by authorized users in the SonarQube interface: see the rule I mentioned on sonarqube.com.

To unsubscribe from this group and stop receiving emails from it, send an email to sonarqube+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/sonarqube/31547acf-3770-4db1-ad15-f250516e5183%40googlegroups.com.

Salih Karahan

unread,
Jan 25, 2017, 1:06:04 AM1/25/17
to SonarQube, slhka...@gmail.com
Hımm, i see but this way can't response to my need. Actually, i want to read value of project > administration > general settings like below screenshot. Because We want to change the value each project in a quality profile. I hope i explain my need.



24 Ocak 2017 Salı 19:02:00 UTC+3 tarihinde Pierre-Yves Nicolas yazdı:

Salih Karahan

unread,
Jan 26, 2017, 1:05:05 AM1/26/17
to SonarQube
Up. Any way? has sonarqube a service locator? Can we access any sonar object(settings, fileSystem, resources, ...) from anywhere? :'( 

24 Ocak 2017 Salı 15:53:25 UTC+3 tarihinde Salih Karahan yazdı:

Elena Vilchik

unread,
Feb 23, 2017, 5:27:35 AM2/23/17
to SonarQube
Hello,

You have no way to access settings from a custom plugin for SonarJS.
Reply all
Reply to author
Forward
0 new messages