Skip to content

Commit

Permalink
refactor: Remove unnecessary code and add the DefaultRulesDefinition …
Browse files Browse the repository at this point in the history
…class to define the repository
  • Loading branch information
felipebz committed Apr 24, 2023
1 parent 4d22f86 commit cb2125f
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package br.com.felipezorzo.zpa.cli

import org.sonar.plsqlopen.checks.CheckList
import org.sonar.plugins.plsqlopen.api.ZpaRulesDefinition

class DefaultRulesDefinition : ZpaRulesDefinition {
override fun checkClasses(): Array<Class<*>> {
return CheckList.checks.toTypedArray()
}

override fun repositoryKey(): String {
return "zpa"
}

override fun repositoryName(): String {
return "Default"
}
}
55 changes: 31 additions & 24 deletions src/main/kotlin/br/com/felipezorzo/zpa/cli/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,17 @@ import com.github.ajalt.clikt.parameters.types.choice
import com.google.common.base.Stopwatch
import com.google.gson.Gson
import org.sonar.plsqlopen.CustomAnnotationBasedRulesDefinition
import org.sonar.plsqlopen.checks.CheckList
import org.sonar.plsqlopen.metadata.FormsMetadata
import org.sonar.plsqlopen.rules.*
import org.sonar.plsqlopen.rules.ActiveRules
import org.sonar.plsqlopen.rules.Repository
import org.sonar.plsqlopen.rules.RuleMetadataLoader
import org.sonar.plsqlopen.rules.ZpaChecks
import org.sonar.plsqlopen.squid.AstScanner
import org.sonar.plsqlopen.squid.ProgressReport
import org.sonar.plsqlopen.squid.ZpaIssue
import org.sonar.plsqlopen.utils.log.Loggers
import org.sonar.plugins.plsqlopen.api.PlSqlFile
import org.sonar.plugins.plsqlopen.api.checks.PlSqlVisitor
import java.io.File
import java.nio.charset.StandardCharsets
import java.util.*
Expand Down Expand Up @@ -68,17 +71,27 @@ class Main : CliktCommand(name = "zpa-cli") {
}
}

val repository = Repository("zpa")
val activeRulesOnSonarQube = sonarqubeLoader?.downloadQualityProfile() ?: emptyList()
val activeRules = ActiveRules().configureRules(activeRulesOnSonarQube)

val ruleMetadataLoader = RuleMetadataLoader()
CustomAnnotationBasedRulesDefinition.load(repository, "plsqlopen", CheckList.checks, ruleMetadataLoader)

val activeRulesOnSonarQube = sonarqubeLoader?.downloadQualityProfile() ?: emptyList()
val checkList = mutableListOf<PlSqlVisitor>()

val rulesDefinitions= listOf(DefaultRulesDefinition())

val activeRules = ActiveRules().addRepository(repository)
.configureRules(activeRulesOnSonarQube)
for (rulesDefinition in rulesDefinitions) {
val repository = Repository(rulesDefinition.repositoryKey())
CustomAnnotationBasedRulesDefinition.load(repository, "plsqlopen",
rulesDefinition.checkClasses().toList(), ruleMetadataLoader)

val checks = ZpaChecks(activeRules, repository.key, ruleMetadataLoader)
.addAnnotatedChecks(CheckList.checks)
activeRules.addRepository(repository)

val checks = ZpaChecks(activeRules, repository.key, ruleMetadataLoader)
.addAnnotatedChecks(rulesDefinition.checkClasses().toList())

checkList.addAll(checks.all())
}

val files = baseDir
.walkTopDown()
Expand All @@ -91,7 +104,7 @@ class Main : CliktCommand(name = "zpa-cli") {
val progressReport = ProgressReport("Report about progress of code analyzer", TimeUnit.SECONDS.toMillis(10))
progressReport.start(files.map { it.pathRelativeToBase }.toList())

val scanner = AstScanner(checks.all(), metadata, true, StandardCharsets.UTF_8)
val scanner = AstScanner(checkList, metadata, true, StandardCharsets.UTF_8)

val issues = files.parallelStream().flatMap { file ->
val scannerResult = scanner.scanFile(file)
Expand All @@ -107,11 +120,11 @@ class Main : CliktCommand(name = "zpa-cli") {
val generatedOutput =
when (outputFormat) {
GENERIC_ISSUE_FORMAT -> {
exportToGenericIssueFormat(repository, checks, issues)
exportToGenericIssueFormat(issues)
}
SONAR_REPORT_FORMAT -> {
sonarqubeLoader?.let {
val issuesToExport = it.updateIssues(repository, checks, activeRules, issues)
val issuesToExport = it.updateIssues(activeRules, issues)
val gson = Gson()
gson.toJson(issuesToExport)
}.orEmpty()
Expand All @@ -137,7 +150,7 @@ class Main : CliktCommand(name = "zpa-cli") {
val startLine = issue.primaryLocation.startLine()
val startColumn = issue.primaryLocation.startLineOffset()
val activeRule = issue.check.activeRule
var severity = activeRule.severity
val severity = activeRule.severity

var positionFormatted = "$startLine"
if (startColumn != -1) {
Expand All @@ -150,11 +163,7 @@ class Main : CliktCommand(name = "zpa-cli") {
}
}

private fun exportToGenericIssueFormat(
repository: Repository,
checks: ZpaChecks,
issues: List<ZpaIssue>
): String {
private fun exportToGenericIssueFormat(issues: List<ZpaIssue>): String {
val genericIssues = mutableListOf<GenericIssue>()
for (issue in issues) {
val relativeFilePathStr = (issue.file as InputFile).pathRelativeToBase
Expand Down Expand Up @@ -185,22 +194,20 @@ class Main : CliktCommand(name = "zpa-cli") {
)
}

val ruleKey = checks.ruleKey(issue.check) as ZpaRuleKey
val rule = repository.rule(ruleKey.rule) as ZpaRule
val activeRule = issue.check.activeRule

val type = when {
rule.tags.contains("vulnerability") -> "VULNERABILITY"
rule.tags.contains("bug") -> "BUG"
activeRule.tags.contains("vulnerability") -> "VULNERABILITY"
activeRule.tags.contains("bug") -> "BUG"
else -> "CODE_SMELL"
}

genericIssues += GenericIssue(
ruleId = rule.key,
ruleId = activeRule.ruleKey.toString(),
severity = activeRule.severity,
type = type,
primaryLocation = primaryLocation,
duration = rule.remediationConstant,
duration = activeRule.remediationConstant,
secondaryLocations = secondaryLocations
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ package br.com.felipezorzo.zpa.cli.sonarqube

import br.com.felipezorzo.zpa.cli.InputFile
import br.com.felipezorzo.zpa.cli.tracker.Trackable
import org.sonar.plsqlopen.rules.ZpaRule
import org.sonar.plsqlopen.squid.ZpaIssue

class LocalIssueAdapter(override val ruleKey: String, private val rule: ZpaRule, private val localIssue: ZpaIssue) : Trackable {
class LocalIssueAdapter(override val ruleKey: String, private val localIssue: ZpaIssue) : Trackable {
override val message: String
get() = localIssue.primaryLocation.message()
override val line: Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
import com.google.protobuf.InvalidProtocolBufferException
import com.google.protobuf.Parser
import org.sonar.plsqlopen.rules.*
import org.sonar.plsqlopen.rules.ActiveRule
import org.sonar.plsqlopen.rules.ActiveRuleConfiguration
import org.sonar.plsqlopen.rules.ActiveRules
import org.sonar.plsqlopen.squid.ZpaIssue
import org.sonar.scanner.protocol.input.ScannerInput
import org.sonarqube.ws.client.HttpConnector
Expand All @@ -30,17 +32,14 @@ class SonarQubeLoader(private val sonarQubeOptions: SonarQubeOptions) {
.credentials(sonarQubeOptions.sonarqubeToken, "")
.build())

fun updateIssues(repository: Repository, checks: ZpaChecks, activeRules: ActiveRules, issues: List<ZpaIssue>): SonarPreviewReport {
fun updateIssues(activeRules: ActiveRules, issues: List<ZpaIssue>): SonarPreviewReport {
val serverIssues = downloadIssues()

val analyzedFiles = issues.map { (it.file as InputFile).pathRelativeToBase }.toSet()
val filteredIssues = serverIssues.filter { analyzedFiles.contains(it.path) }

val localIssues = issues.map {
val ruleKey = checks.ruleKey(it.check) as ZpaRuleKey
val rule = repository.rule(ruleKey.rule) as ZpaRule

LocalIssueAdapter(ruleKey.toString(), rule, it)
LocalIssueAdapter(it.check.activeRule.ruleKey.toString(), it)
}

val trackerResult = Tracker<ServerIssueAdapter, LocalIssueAdapter>().track(
Expand Down Expand Up @@ -92,8 +91,7 @@ class SonarQubeLoader(private val sonarQubeOptions: SonarQubeOptions) {
issuesToExport.any { issue -> issue.rule == it.ruleKey.toString() }
}
.map {
val rule = repository.rule(it.ruleKey.rule) as ZpaRule
Rule(it.ruleKey.toString(), rule.name, it.ruleKey.repository, it.ruleKey.rule)
Rule(it.ruleKey.toString(), it.name, it.ruleKey.repository, it.ruleKey.rule)
}

return SonarPreviewReport(listOf(), issuesToExport, rules, "")
Expand Down

0 comments on commit cb2125f

Please sign in to comment.