Skip to content

Commit b79c8a1

Browse files
committed
Draft using user classpath in spring-analyzer
1 parent 9e2eaae commit b79c8a1

File tree

20 files changed

+128
-261
lines changed

20 files changed

+128
-261
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/UtSettings.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ object UtSettings : AbstractSettings(logger, defaultKeyForSettingsPath, defaultS
301301
* The property is useful only for the IntelliJ IDEs.
302302
* If the property is set in true the spring analyzer process opens a debug port.
303303
* @see runInstrumentedProcessWithDebug
304-
* @see org.utbot.framework.process.SpringAnalyzerProcess
304+
* @see org.utbot.spring.process.SpringAnalyzerProcess
305305
*/
306306
var runSpringAnalyzerProcessWithDebug by getBooleanProperty(false)
307307

utbot-framework/src/main/kotlin/org/utbot/framework/process/EngineProcessMain.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,12 @@ private fun EngineProcessModel.setup(kryoHelper: KryoHelper, watchdog: IdleWatch
7777
}.toTypedArray())))
7878
}
7979
watchdog.measureTimeForActiveCall(getSpringBeanQualifiedNames, "Getting Spring bean definitions") { params ->
80-
val springAnalyzerProcess = SpringAnalyzerProcess.createBlocking()
80+
val springAnalyzerProcess = SpringAnalyzerProcess.createBlocking(params.classpath.toList())
8181
val beans = springAnalyzerProcess.terminateOnException { _ ->
8282
springAnalyzerProcess.getBeanQualifiedNames(
8383
params.classpath.toList(),
8484
params.config,
85-
// TODO remove once spring-analyzer learns to find resources on its own, temporarily leaving it here for testing with hardcoded absolute paths
86-
propertyFilesPaths = emptyList(),
87-
xmlConfigurationPaths = emptyList(),
88-
params.useSpringAnalyzer
85+
params.fileStorage,
8986
).toTypedArray()
9087
}
9188
springAnalyzerProcess.terminate()

utbot-framework/src/main/kotlin/org/utbot/framework/process/generated/EngineProcessModel.Generated.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class EngineProcessModel private constructor(
7272

7373
private val __StringArraySerializer = FrameworkMarshallers.String.array()
7474

75-
const val serializationHash = 1955031277042475752L
75+
const val serializationHash = -8371458556124482010L
7676

7777
}
7878
override val serializersOwner: ISerializersOwner get() = EngineProcessModel
@@ -754,7 +754,7 @@ data class GenerateTestReportResult (
754754
data class GetSpringBeanQualifiedNamesParams (
755755
val classpath: Array<String>,
756756
val config: String,
757-
val useSpringAnalyzer: Boolean
757+
val fileStorage: String?
758758
) : IPrintable {
759759
//companion
760760

@@ -765,14 +765,14 @@ data class GetSpringBeanQualifiedNamesParams (
765765
override fun read(ctx: SerializationCtx, buffer: AbstractBuffer): GetSpringBeanQualifiedNamesParams {
766766
val classpath = buffer.readArray {buffer.readString()}
767767
val config = buffer.readString()
768-
val useSpringAnalyzer = buffer.readBool()
769-
return GetSpringBeanQualifiedNamesParams(classpath, config, useSpringAnalyzer)
768+
val fileStorage = buffer.readNullable { buffer.readString() }
769+
return GetSpringBeanQualifiedNamesParams(classpath, config, fileStorage)
770770
}
771771

772772
override fun write(ctx: SerializationCtx, buffer: AbstractBuffer, value: GetSpringBeanQualifiedNamesParams) {
773773
buffer.writeArray(value.classpath) { buffer.writeString(it) }
774774
buffer.writeString(value.config)
775-
buffer.writeBool(value.useSpringAnalyzer)
775+
buffer.writeNullable(value.fileStorage) { buffer.writeString(it) }
776776
}
777777

778778

@@ -790,7 +790,7 @@ data class GetSpringBeanQualifiedNamesParams (
790790

791791
if (!(classpath contentDeepEquals other.classpath)) return false
792792
if (config != other.config) return false
793-
if (useSpringAnalyzer != other.useSpringAnalyzer) return false
793+
if (fileStorage != other.fileStorage) return false
794794

795795
return true
796796
}
@@ -799,7 +799,7 @@ data class GetSpringBeanQualifiedNamesParams (
799799
var __r = 0
800800
__r = __r*31 + classpath.contentDeepHashCode()
801801
__r = __r*31 + config.hashCode()
802-
__r = __r*31 + useSpringAnalyzer.hashCode()
802+
__r = __r*31 + if (fileStorage != null) fileStorage.hashCode() else 0
803803
return __r
804804
}
805805
//pretty print
@@ -808,7 +808,7 @@ data class GetSpringBeanQualifiedNamesParams (
808808
printer.indent {
809809
print("classpath = "); classpath.print(printer); println()
810810
print("config = "); config.print(printer); println()
811-
print("useSpringAnalyzer = "); useSpringAnalyzer.print(printer); println()
811+
print("fileStorage = "); fileStorage.print(printer); println()
812812
}
813813
printer.print(")")
814814
}

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.intellij.openapi.progress.ProgressIndicator
88
import com.intellij.openapi.progress.Task
99
import com.intellij.openapi.project.DumbService
1010
import com.intellij.openapi.project.Project
11+
import com.intellij.openapi.project.guessProjectDir
1112
import com.intellij.openapi.roots.OrderEnumerator
1213
import com.intellij.openapi.roots.ProjectFileIndex
1314
import com.intellij.openapi.ui.Messages
@@ -28,6 +29,7 @@ import com.intellij.util.concurrency.AppExecutorUtil
2829
import com.intellij.util.containers.ContainerUtil
2930
import com.intellij.util.containers.nullize
3031
import com.intellij.util.io.exists
32+
import com.jetbrains.python.sdk.basePath
3133
import java.io.File
3234
import java.nio.file.Path
3335
import java.nio.file.Paths
@@ -225,8 +227,10 @@ object UtTestsDialogProcessor {
225227
process.getSpringBeanQualifiedNames(
226228
buildDirs + classpathList,
227229
approach.config,
228-
model.useSpringAnalyzer
229-
).also { logger.info { "Detected Spring Beans: $it" } }
230+
// TODO use common parent path for srcModule and used Spring
231+
// config module if they are different modules
232+
model.srcModule.basePath
233+
)
230234
}
231235

232236
SpringApplicationContext(

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/models/GenerateTestsModel.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,6 @@ class GenerateTestsModel(
5656

5757
lateinit var typeReplacementApproach: TypeReplacementApproach
5858

59-
// TODO remove once issue with spring-analyzer expecting .properties and .xml file paths is resolved
60-
var useSpringAnalyzer = false
61-
6259
val conflictTriggers: ConflictTriggers = ConflictTriggers()
6360

6461
var runGeneratedTestsWithCoverage : Boolean = false

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/process/EngineProcess.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,10 @@ class EngineProcess private constructor(val project: Project, private val classN
145145
engineModel.setupUtContext.startBlocking(SetupContextParams(classpathForUrlsClassloader))
146146
}
147147

148-
fun getSpringBeanQualifiedNames(classpathList: List<String>, config: String, useSpringAnalyzer: Boolean): List<String> {
148+
fun getSpringBeanQualifiedNames(classpathList: List<String>, config: String, fileStorage: String?): List<String> {
149149
assertReadAccessNotAllowed()
150150
return engineModel.getSpringBeanQualifiedNames.startBlocking(
151-
GetSpringBeanQualifiedNamesParams(classpathList.toTypedArray(), config, useSpringAnalyzer)
151+
GetSpringBeanQualifiedNamesParams(classpathList.toTypedArray(), config, fileStorage)
152152
).toList()
153153
}
154154

utbot-rd/src/main/rdgen/org/utbot/rd/models/EngineProcessModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ object EngineProcessModel : Ext(EngineProcessRoot) {
8787
val getSpringBeanQualifiedNamesParams = structdef {
8888
field("classpath", array(PredefinedType.string))
8989
field("config", PredefinedType.string)
90-
field("useSpringAnalyzer", PredefinedType.bool)
90+
field("fileStorage", PredefinedType.string.nullable)
9191
}
9292
val methodDescription = structdef {
9393
field("name", PredefinedType.string)

utbot-rd/src/main/rdgen/org/utbot/rd/models/SpringAnalyzerModel.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ object SpringAnalyzerProcessModel : Ext(SpringAnalyzerRoot) {
99
val springAnalyzerParams = structdef {
1010
field("classpath", array(PredefinedType.string))
1111
field("configuration", PredefinedType.string)
12-
field("propertyFilesPaths", array(PredefinedType.string))
13-
field("xmlConfigurationPaths", array(PredefinedType.string))
14-
field("useSpringAnalyzer", PredefinedType.bool)
12+
field("fileStorage", PredefinedType.string.nullable)
1513
}
1614

1715
val springAnalyzerResult = structdef {

utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/ApplicationRunner.kt

Lines changed: 0 additions & 48 deletions
This file was deleted.
Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.utbot.spring.analyzers
22

3+
import com.jetbrains.rd.util.getLogger
4+
import com.jetbrains.rd.util.info
35
import org.springframework.boot.builder.SpringApplicationBuilder
46
import org.springframework.context.ApplicationContextException
57
import org.utbot.spring.configurators.ApplicationConfigurationType
@@ -11,22 +13,19 @@ import org.utbot.spring.utils.FakeFileManager
1113
import org.utbot.spring.postProcessors.UtBotBeanFactoryPostProcessor
1214
import java.io.File
1315

16+
val logger = getLogger<SpringApplicationAnalyzer>()
17+
1418
class SpringApplicationAnalyzer(
1519
private val applicationData: ApplicationData
1620
) {
1721

1822
fun analyze(): List<String> {
19-
val fakeFileManager =
20-
FakeFileManager(applicationData.propertyFilesPaths + applicationData.xmlConfigurationPaths)
21-
fakeFileManager.createTempFiles()
23+
logger.info { "Analyzer Java: " + System.getProperty("java.version") }
2224

2325
val applicationBuilder = SpringApplicationBuilder(SpringApplicationAnalyzer::class.java)
2426
val applicationConfigurator = ApplicationConfigurator(applicationBuilder, applicationData)
2527

26-
when (findConfigurationType(applicationData)) {
27-
XmlConfiguration -> applicationConfigurator.configureXmlBasedApplication()
28-
else -> applicationConfigurator.configureJavaBasedApplication()
29-
}
28+
applicationConfigurator.configureApplication()
3029

3130
try {
3231
applicationBuilder.build()
@@ -35,19 +34,8 @@ class SpringApplicationAnalyzer(
3534
// UtBotBeanFactoryPostProcessor destroys bean definitions
3635
// to prevent Spring application from actually starting and
3736
// that causes it to throw ApplicationContextException
38-
println("Bean analysis finished successfully")
39-
} finally {
40-
fakeFileManager.deleteTempFiles()
37+
logger.info { "Bean analysis finished successfully" }
4138
}
4239
return UtBotBeanFactoryPostProcessor.beanQualifiedNames
4340
}
44-
45-
private fun findConfigurationType(applicationData: ApplicationData): ApplicationConfigurationType {
46-
//TODO: support Spring Boot Applications here.
47-
val fileExtension = File(applicationData.configurationFile).extension
48-
return when (fileExtension) {
49-
"xml" -> XmlConfiguration
50-
else -> JavaConfiguration
51-
}
52-
}
5341
}
Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,56 @@
11
package org.utbot.spring.configurators
22

3+
import com.jetbrains.rd.util.getLogger
4+
import com.jetbrains.rd.util.info
5+
import org.springframework.beans.factory.support.BeanDefinitionRegistry
6+
import org.springframework.beans.factory.support.SimpleBeanDefinitionRegistry
7+
import org.springframework.boot.SpringApplication
38
import org.springframework.boot.builder.SpringApplicationBuilder
9+
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner
10+
import org.springframework.context.annotation.ComponentScanBeanDefinitionParser
11+
import org.springframework.core.io.DefaultResourceLoader
412
import org.utbot.spring.config.TestApplicationConfiguration
513
import org.utbot.spring.data.ApplicationData
614
import org.utbot.spring.utils.ConfigurationManager
15+
import java.io.File
716
import java.net.URLClassLoader
17+
import kotlin.io.path.Path
18+
19+
private val logger = getLogger<ApplicationConfigurator>()
820

921
open class ApplicationConfigurator(
1022
private val applicationBuilder: SpringApplicationBuilder,
1123
private val applicationData: ApplicationData
1224
) {
13-
private val classLoader: ClassLoader = URLClassLoader(applicationData.applicationUrlArray)
14-
15-
fun configureJavaBasedApplication() {
16-
configureApplication(
17-
configurationClass = classLoader.loadClass(applicationData.configurationFile),
18-
xmlConfigurationPaths = applicationData.xmlConfigurationPaths
19-
)
20-
}
21-
22-
fun configureXmlBasedApplication() {
23-
configureApplication(
24-
configurationClass = TestApplicationConfiguration::class.java,
25-
xmlConfigurationPaths = listOf(applicationData.configurationFile)
26-
)
25+
// private val classLoader: ClassLoader = URLClassLoader(applicationData.classpath)
26+
private val classLoader: ClassLoader = this::class.java.classLoader
27+
28+
fun configureApplication() {
29+
//applicationBuilder.resourceLoader(DefaultResourceLoader().also { it.classLoader = classLoader })
30+
when (findConfigurationType(applicationData)) {
31+
ApplicationConfigurationType.XmlConfiguration -> {
32+
logger.info { "Using xml Spring configuration" }
33+
val configurationManager = ConfigurationManager(classLoader, TestApplicationConfiguration::class.java)
34+
// Put `applicationData.configurationFile` in `@ImportResource` of `TestApplicationConfiguration`
35+
configurationManager.patchImportResourceAnnotation(Path(applicationData.configurationFile).fileName)
36+
applicationBuilder.sources(TestApplicationConfiguration::class.java)
37+
}
38+
else -> {
39+
logger.info { "Using java Spring configuration" }
40+
applicationBuilder.sources(
41+
TestApplicationConfiguration::class.java,
42+
classLoader.loadClass(applicationData.configurationFile)
43+
)
44+
}
45+
}
2746
}
2847

29-
private fun configureApplication(configurationClass: Class<*>, xmlConfigurationPaths: List<String>) {
30-
31-
val configurationManager = ConfigurationManager(classLoader, configurationClass)
32-
33-
val xmlFilesConfigurator = XmlFilesConfigurator(xmlConfigurationPaths, configurationManager)
34-
val propertiesConfigurator = PropertiesConfigurator(applicationData.propertyFilesPaths, configurationManager)
35-
36-
propertiesConfigurator.configure()
37-
xmlFilesConfigurator.configure()
38-
39-
for (prop in propertiesConfigurator.readProperties()) {
40-
applicationBuilder.properties(prop)
48+
private fun findConfigurationType(applicationData: ApplicationData): ApplicationConfigurationType {
49+
//TODO: support Spring Boot Applications here.
50+
val fileExtension = File(applicationData.configurationFile).extension
51+
return when (fileExtension) {
52+
"xml" -> ApplicationConfigurationType.XmlConfiguration
53+
else -> ApplicationConfigurationType.JavaConfiguration
4154
}
42-
applicationBuilder.sources(TestApplicationConfiguration::class.java, configurationClass)
4355
}
4456
}

utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/configurators/PropertiesConfigurator.kt

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)