Inject automatically BotLikeExtractorImpl
Do not require to instantiate explicitly the extractor for bot-like
comments. Bind the proper implementation in the Guice module and
instantiate it automatically with Guice when needed.
Change-Id: Ib88bf8809607ee63b43613b937b0c531dc89b0f8
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/AnalyticsConfig.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/AnalyticsConfig.scala
index 108b271..8035a43 100644
--- a/src/main/scala/com/googlesource/gerrit/plugins/analytics/AnalyticsConfig.scala
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/AnalyticsConfig.scala
@@ -26,5 +26,7 @@
val Contributors = "contributors"
val BotlikeFilenameRegexp = "botlike-filename-regexp"
- lazy val botlikeFilenameRegexps: List[String] = pluginConfig.getStringList(Contributors, null, BotlikeFilenameRegexp).toList
+ lazy val botlikeFilenameRegexps: List[String] = pluginConfigBotLikeFilenameRegexp
+
+ private lazy val pluginConfigBotLikeFilenameRegexp = pluginConfig.getStringList(Contributors, null, BotlikeFilenameRegexp).toList
}
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/Contributors.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/Contributors.scala
index 1bda651..932e04c 100644
--- a/src/main/scala/com/googlesource/gerrit/plugins/analytics/Contributors.scala
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/Contributors.scala
@@ -78,7 +78,7 @@
override protected def run =
gsonFmt.format(executor.get(projectRes, beginDate, endDate,
- granularity.getOrElse(AggregationStrategy.EMAIL), extractBranches, extractIssues, botLikeRegexps), stdout)
+ granularity.getOrElse(AggregationStrategy.EMAIL), extractBranches, extractIssues), stdout)
}
@@ -134,28 +134,28 @@
Response.ok(
new GsonStreamedResult[UserActivitySummary](gson,
executor.get(projectRes, beginDate, endDate,
- granularity.getOrElse(AggregationStrategy.EMAIL), extractBranches, extractIssues, botLikeRegexps)))
+ granularity.getOrElse(AggregationStrategy.EMAIL), extractBranches, extractIssues)))
}
class ContributorsService @Inject()(repoManager: GitRepositoryManager,
projectCache:ProjectCache,
histogram: UserActivityHistogram,
- gsonFmt: GsonFormatter) {
+ gsonFmt: GsonFormatter,
+ botLikeExtractor: BotLikeExtractor) {
import RichBoolean._
import scala.collection.JavaConverters._
def get(projectRes: ProjectResource, startDate: Option[Long], stopDate: Option[Long],
- aggregationStrategy: AggregationStrategy, extractBranches: Boolean, extractIssues: Boolean, botLikeIdentifiers: List[String])
+ aggregationStrategy: AggregationStrategy, extractBranches: Boolean, extractIssues: Boolean)
: TraversableOnce[UserActivitySummary] = {
val nameKey = projectRes.getNameKey
val commentLinks: List[CommentLinkInfo] = extractIssues.option {
projectCache.get(nameKey).getCommentLinks.asScala
}.toList.flatten
-
ManagedResource.use(repoManager.openRepository(projectRes.getNameKey)) { repo =>
- val stats = new Statistics(repo, new BotLikeExtractorImpl(botLikeIdentifiers), commentLinks)
+ val stats = new Statistics(repo, botLikeExtractor, commentLinks)
val branchesExtractor = extractBranches.option(new BranchesExtractor(repo))
histogram.get(repo, new AggregatedHistogramFilterByDates(startDate, stopDate, branchesExtractor, aggregationStrategy))
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/Module.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/Module.scala
index 935a198..ca8167b 100644
--- a/src/main/scala/com/googlesource/gerrit/plugins/analytics/Module.scala
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/Module.scala
@@ -17,10 +17,13 @@
import com.google.gerrit.extensions.restapi.RestApiModule
import com.google.gerrit.server.project.ProjectResource.PROJECT_KIND
import com.google.inject.AbstractModule
+import com.googlesource.gerrit.plugins.analytics.common.{BotLikeExtractor, BotLikeExtractorImpl}
class Module extends AbstractModule {
override protected def configure() {
+ bind(classOf[BotLikeExtractor]).to(classOf[BotLikeExtractorImpl])
+
install(new RestApiModule() {
override protected def configure() = {
get(PROJECT_KIND, "contributors").to(classOf[ContributorsResource])
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractor.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractor.scala
index 16a8bf2..ac67647 100644
--- a/src/main/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractor.scala
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractor.scala
@@ -14,13 +14,16 @@
package com.googlesource.gerrit.plugins.analytics.common
+import com.google.inject.Inject
+import com.googlesource.gerrit.plugins.analytics.AnalyticsConfig
+
import scala.util.matching.Regex
trait BotLikeExtractor {
def isBotLike(files: Set[String]): Boolean
}
-class BotLikeExtractorImpl(botLikeIdentifiers: List[String]) extends BotLikeExtractor {
- private val botRegexps = new Regex(botLikeIdentifiers.mkString("|"))
- override def isBotLike(files: Set[String]): Boolean = botLikeIdentifiers.nonEmpty && files.forall(botRegexps.findFirstIn(_).isDefined)
+class BotLikeExtractorImpl @Inject() (val analyticsConfig: AnalyticsConfig) extends BotLikeExtractor {
+ private val botRegexps = new Regex(analyticsConfig.botlikeFilenameRegexps.mkString("|"))
+ override def isBotLike(files: Set[String]): Boolean = analyticsConfig.botlikeFilenameRegexps.nonEmpty && files.forall(botRegexps.findFirstIn(_).isDefined)
}
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractorImplSpec.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractorImplSpec.scala
index 2893a31..dedab3b 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractorImplSpec.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractorImplSpec.scala
@@ -14,6 +14,7 @@
package com.googlesource.gerrit.plugins.analytics.common
+import com.googlesource.gerrit.plugins.analytics.AnalyticsConfig
import com.googlesource.gerrit.plugins.analytics.test.GitTestCase
import org.scalatest.{FlatSpec, Matchers}
@@ -22,7 +23,7 @@
behavior of "isBotLike"
it should "return true when all files match bot-like identifiers" in {
- val extractor = new BotLikeExtractorImpl(List(""".+\.xml"""))
+ val extractor = newBotLikeExtractorImpl(List(""".+\.xml"""))
extractor.isBotLike(Set(
"some/path/AFile.xml",
@@ -32,7 +33,7 @@
}
it should "return false when at least one file does not match bot-like identifiers" in {
- val extractor = new BotLikeExtractorImpl(List(""".+\.xml"""))
+ val extractor = newBotLikeExtractorImpl(List(""".+\.xml"""))
extractor.isBotLike(Set(
"some/path/AFile.xml",
@@ -42,10 +43,14 @@
}
it should "return false when no bot-like identifiers have been provided" in {
- val extractor = new BotLikeExtractorImpl(List.empty)
+ val extractor = newBotLikeExtractorImpl(List.empty)
extractor.isBotLike(Set("some/path/anyFile")).shouldBe(false)
}
+ private def newBotLikeExtractorImpl(botLikeRegexps: List[String]) = new BotLikeExtractorImpl(new AnalyticsConfig(null, null) {
+ override lazy val botlikeFilenameRegexps = botLikeRegexps
+ })
+
}