Skip to content

Commit 8ac1847

Browse files
Merge pull request #202 from Drill4J/feature/add-parameter-to-ignore-methods-by-annotation-packages
Feature/add parameter to ignore methods by annotation packages
2 parents eda48c2 + dfe115c commit 8ac1847

2 files changed

Lines changed: 52 additions & 5 deletions

File tree

test2code/src/main/kotlin/com/epam/drill/agent/test2code/Test2Code.kt

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,16 +148,33 @@ class Test2Code(
148148
return
149149
}
150150
var classCount = 0
151-
var methodCount = 0
151+
var totalMethodsCount = 0
152+
var filteredMethodsCount = 0
153+
154+
val excludeMethodsByAnnotationPackage =
155+
configuration.parameters[Test2CodeParameterDefinitions.EXCLUDE_METHODS_BY_ANNOTATION_PACKAGE] as List<String>
156+
val hasAnnotationsExclusions = excludeMethodsByAnnotationPackage.isNotEmpty()
157+
152158
scanClasses { classes ->
153159
classes
154160
.also { classCount += it.size }
155-
.flatMap { parseAstClass(it.entityName(), it.bytes()) }
156-
.also { methodCount += it.size }
157-
.chunked(configuration.parameters[Test2CodeParameterDefinitions.METHODS_SEND_PAGE_SIZE])
161+
.asSequence()
162+
.flatMap { parseAstClass(it.entityName(), it.bytes()).asSequence() }
163+
.onEach { totalMethodsCount++ }
164+
.filter { method ->
165+
!hasAnnotationsExclusions ||
166+
method.annotations?.keys?.none { key ->
167+
excludeMethodsByAnnotationPackage.any { key.contains(it) }
168+
} ?: false
169+
}
170+
.onEach { filteredMethodsCount++ }
171+
.chunkedLazy(configuration.parameters[Test2CodeParameterDefinitions.METHODS_SEND_PAGE_SIZE])
158172
.forEach(::sendClassMetadata)
159173
}
160-
logger.info { "Scanned $classCount classes with $methodCount methods" }
174+
logger.info { """Scanned $classCount classes with $filteredMethodsCount methods
175+
| total methods: ${totalMethodsCount + filteredMethodsCount};
176+
| methods excluded by annotations: ${totalMethodsCount - filteredMethodsCount}
177+
| packages for annotations-based exclusion are specified in ${Test2CodeParameterDefinitions.EXCLUDE_METHODS_BY_ANNOTATION_PACKAGE.name} parameter """.trimMargin() }
161178
}
162179

163180
private val classMetadataDestination = AgentMessageDestination("PUT", "methods")
@@ -174,5 +191,16 @@ class Test2Code(
174191
logger.debug { "sendClassMetadata: Sending methods: $message" }
175192
sender.send(classMetadataDestination, message, ClassMetadata.serializer())
176193
}
194+
}
177195

196+
private fun <T> Sequence<T>.chunkedLazy(size: Int): Sequence<List<T>> = sequence {
197+
val buffer = mutableListOf<T>()
198+
for (item in this@chunkedLazy) {
199+
buffer += item
200+
if (buffer.size == size) {
201+
yield(buffer.toList())
202+
buffer.clear()
203+
}
204+
}
205+
if (buffer.isNotEmpty()) yield(buffer.toList())
178206
}

test2code/src/main/kotlin/com/epam/drill/agent/test2code/configuration/Test2CodeParameterDefinitions.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.epam.drill.agent.common.configuration.AgentParameterDefinitionCollect
2121
import com.epam.drill.agent.common.configuration.BaseAgentParameterDefinition
2222
import com.epam.drill.agent.common.configuration.ValidationType
2323
import com.epam.drill.agent.configuration.isNotBlank
24+
import com.epam.drill.agent.configuration.isValidPackage
2425
import com.epam.drill.agent.configuration.minDuration
2526

2627
object Test2CodeParameterDefinitions : AgentParameterDefinitionCollection() {
@@ -68,5 +69,23 @@ object Test2CodeParameterDefinitions : AgentParameterDefinitionCollection() {
6869
description = "Enable/disable application classes scanning",
6970
defaultValue = true
7071
).register()
72+
val EXCLUDE_METHODS_BY_ANNOTATION_PACKAGE = AgentParameterDefinition.forList(
73+
name = "excludeMethodsByAnnotationPackage",
74+
description = """
75+
Excludes methods with annotations from the specified packages from code scanning process.
76+
Matches exact packages and descendants.
77+
78+
Package names must be delimited with / (forward slash) and separated by ;
79+
80+
Example: exclude methods autogenerated by SLF4J and Lombok
81+
org/slf4j;lombok
82+
""".trimIndent(),
83+
defaultValue = emptyList(),
84+
parser = { it.split(";") },
85+
validation = ValidationType.SOFT,
86+
itemValidator = {
87+
isValidPackage()
88+
}
89+
).register()
7190

7291
}

0 commit comments

Comments
 (0)