From 264c5666282dd9a70981156b6c14436a74047005 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Fri, 21 Apr 2023 16:30:17 +0300 Subject: [PATCH 1/3] A prototype of setting active profile --- .../spring/configurators/ApplicationConfigurator.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/configurators/ApplicationConfigurator.kt b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/configurators/ApplicationConfigurator.kt index 34af539851..421ba0a2e3 100644 --- a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/configurators/ApplicationConfigurator.kt +++ b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/configurators/ApplicationConfigurator.kt @@ -3,12 +3,14 @@ package org.utbot.spring.configurators import com.jetbrains.rd.util.getLogger import com.jetbrains.rd.util.info import org.springframework.boot.builder.SpringApplicationBuilder -import org.utbot.spring.config.TestApplicationConfiguration +import org.springframework.core.env.StandardEnvironment import org.utbot.spring.api.ApplicationData +import org.utbot.spring.config.TestApplicationConfiguration import org.utbot.spring.utils.ConfigurationManager import java.io.File import kotlin.io.path.Path + private val logger = getLogger() open class ApplicationConfigurator( @@ -38,6 +40,15 @@ open class ApplicationConfigurator( ) } } + + setActiveProfile() + } + + private fun setActiveProfile() { + val environment = StandardEnvironment() + environment.setActiveProfiles("huiiuh") + + applicationBuilder.environment(environment) } private fun findConfigurationType(applicationData: ApplicationData): ApplicationConfigurationType { From 317983f82737a4b3db0ebc2513ad8cf056233475 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Fri, 21 Apr 2023 16:43:52 +0300 Subject: [PATCH 2/3] Introduce profileExpression --- .../kotlin/org/utbot/spring/api/ApplicationData.kt | 1 + .../spring/configurators/ApplicationConfigurator.kt | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/api/ApplicationData.kt b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/api/ApplicationData.kt index 7b2e83fb34..de7bbb81aa 100644 --- a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/api/ApplicationData.kt +++ b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/api/ApplicationData.kt @@ -6,4 +6,5 @@ class ApplicationData( val classpath: Array, val configurationFile: String, val fileStorage: String?, + val profileExpression: String?, ) diff --git a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/configurators/ApplicationConfigurator.kt b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/configurators/ApplicationConfigurator.kt index 421ba0a2e3..58d83c51f8 100644 --- a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/configurators/ApplicationConfigurator.kt +++ b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/configurators/ApplicationConfigurator.kt @@ -10,7 +10,7 @@ import org.utbot.spring.utils.ConfigurationManager import java.io.File import kotlin.io.path.Path - +const val DEFAULT_PROFILE_NAME = "default" private val logger = getLogger() open class ApplicationConfigurator( @@ -41,16 +41,21 @@ open class ApplicationConfigurator( } } - setActiveProfile() + setActiveProfile(applicationData.profileExpression ?: DEFAULT_PROFILE_NAME) } - private fun setActiveProfile() { + private fun setActiveProfile(profileExpression: String) { + val profilesToActivate = parseProfileExpression(profileExpression) + val environment = StandardEnvironment() - environment.setActiveProfiles("huiiuh") + environment.setActiveProfiles(*profilesToActivate) applicationBuilder.environment(environment) } + //TODO: implement this, e.g. 'prod|web' -> listOf(prod, web) + private fun parseProfileExpression(profileExpression: String) : Array = arrayOf(profileExpression) + private fun findConfigurationType(applicationData: ApplicationData): ApplicationConfigurationType { //TODO: support Spring Boot Applications here. val fileExtension = File(applicationData.configurationFile).extension From f68f58e7e12db10fc46b313489014b7fe28fc669 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Fri, 21 Apr 2023 17:20:04 +0300 Subject: [PATCH 3/3] Create new rd models for utbot-spring-analyzer --- .../framework/process/EngineProcessMain.kt | 2 +- .../generated/EngineProcessModel.Generated.kt | 36 +++++++++++-------- .../generator/UtTestsDialogProcessor.kt | 6 ++-- .../intellij/plugin/process/EngineProcess.kt | 8 +++-- .../org/utbot/rd/models/EngineProcessModel.kt | 3 +- .../utbot/rd/models/SpringAnalyzerModel.kt | 4 +-- .../org/utbot/spring/api/ApplicationData.kt | 3 +- .../SpringAnalyzerProcessModel.Generated.kt | 26 +++++++------- .../spring/process/SpringAnalyzerProcess.kt | 6 ++-- .../process/SpringAnalyzerProcessMain.kt | 4 +-- 10 files changed, 55 insertions(+), 43 deletions(-) diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/process/EngineProcessMain.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/process/EngineProcessMain.kt index 33e0bf4271..2339a533a0 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/process/EngineProcessMain.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/process/EngineProcessMain.kt @@ -81,9 +81,9 @@ private fun EngineProcessModel.setup(kryoHelper: KryoHelper, watchdog: IdleWatch val springAnalyzerProcess = SpringAnalyzerProcess.createBlocking(params.classpath.toList()) val beans = springAnalyzerProcess.terminateOnException { _ -> springAnalyzerProcess.getBeanQualifiedNames( - params.classpath.toList(), params.config, params.fileStorage, + params.profileExpression, ).toTypedArray() } springAnalyzerProcess.terminate() diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/process/generated/EngineProcessModel.Generated.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/process/generated/EngineProcessModel.Generated.kt index 9984cbcdb6..929664dc5a 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/process/generated/EngineProcessModel.Generated.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/process/generated/EngineProcessModel.Generated.kt @@ -73,7 +73,7 @@ class EngineProcessModel private constructor( private val __StringArraySerializer = FrameworkMarshallers.String.array() - const val serializationHash = -8371458556124482010L + const val serializationHash = 6076922965808046990L } override val serializersOwner: ISerializersOwner get() = EngineProcessModel @@ -180,7 +180,7 @@ val IProtocol.engineProcessModel get() = getOrCreateExtension(EngineProcessModel /** - * #### Generated from [EngineProcessModel.kt:104] + * #### Generated from [EngineProcessModel.kt:105] */ data class FindMethodParamNamesArguments ( val classId: ByteArray, @@ -243,7 +243,7 @@ data class FindMethodParamNamesArguments ( /** - * #### Generated from [EngineProcessModel.kt:108] + * #### Generated from [EngineProcessModel.kt:109] */ data class FindMethodParamNamesResult ( val paramNames: ByteArray @@ -300,7 +300,7 @@ data class FindMethodParamNamesResult ( /** - * #### Generated from [EngineProcessModel.kt:97] + * #### Generated from [EngineProcessModel.kt:98] */ data class FindMethodsInClassMatchingSelectedArguments ( val classId: ByteArray, @@ -363,7 +363,7 @@ data class FindMethodsInClassMatchingSelectedArguments ( /** - * #### Generated from [EngineProcessModel.kt:101] + * #### Generated from [EngineProcessModel.kt:102] */ data class FindMethodsInClassMatchingSelectedResult ( val executableIds: ByteArray @@ -588,7 +588,7 @@ data class GenerateResult ( /** - * #### Generated from [EngineProcessModel.kt:116] + * #### Generated from [EngineProcessModel.kt:117] */ data class GenerateTestReportArgs ( val eventLogMessage: String?, @@ -681,7 +681,7 @@ data class GenerateTestReportArgs ( /** - * #### Generated from [EngineProcessModel.kt:125] + * #### Generated from [EngineProcessModel.kt:126] */ data class GenerateTestReportResult ( val notifyMessage: String, @@ -755,7 +755,8 @@ data class GenerateTestReportResult ( data class GetSpringBeanQualifiedNamesParams ( val classpath: Array, val config: String, - val fileStorage: String? + val fileStorage: Array, + val profileExpression: String? ) : IPrintable { //companion @@ -766,14 +767,16 @@ data class GetSpringBeanQualifiedNamesParams ( override fun read(ctx: SerializationCtx, buffer: AbstractBuffer): GetSpringBeanQualifiedNamesParams { val classpath = buffer.readArray {buffer.readString()} val config = buffer.readString() - val fileStorage = buffer.readNullable { buffer.readString() } - return GetSpringBeanQualifiedNamesParams(classpath, config, fileStorage) + val fileStorage = buffer.readArray {buffer.readString()} + val profileExpression = buffer.readNullable { buffer.readString() } + return GetSpringBeanQualifiedNamesParams(classpath, config, fileStorage, profileExpression) } override fun write(ctx: SerializationCtx, buffer: AbstractBuffer, value: GetSpringBeanQualifiedNamesParams) { buffer.writeArray(value.classpath) { buffer.writeString(it) } buffer.writeString(value.config) - buffer.writeNullable(value.fileStorage) { buffer.writeString(it) } + buffer.writeArray(value.fileStorage) { buffer.writeString(it) } + buffer.writeNullable(value.profileExpression) { buffer.writeString(it) } } @@ -791,7 +794,8 @@ data class GetSpringBeanQualifiedNamesParams ( if (!(classpath contentDeepEquals other.classpath)) return false if (config != other.config) return false - if (fileStorage != other.fileStorage) return false + if (!(fileStorage contentDeepEquals other.fileStorage)) return false + if (profileExpression != other.profileExpression) return false return true } @@ -800,7 +804,8 @@ data class GetSpringBeanQualifiedNamesParams ( var __r = 0 __r = __r*31 + classpath.contentDeepHashCode() __r = __r*31 + config.hashCode() - __r = __r*31 + if (fileStorage != null) fileStorage.hashCode() else 0 + __r = __r*31 + fileStorage.contentDeepHashCode() + __r = __r*31 + if (profileExpression != null) profileExpression.hashCode() else 0 return __r } //pretty print @@ -810,6 +815,7 @@ data class GetSpringBeanQualifiedNamesParams ( print("classpath = "); classpath.print(printer); println() print("config = "); config.print(printer); println() print("fileStorage = "); fileStorage.print(printer); println() + print("profileExpression = "); profileExpression.print(printer); println() } printer.print(")") } @@ -882,7 +888,7 @@ data class JdkInfo ( /** - * #### Generated from [EngineProcessModel.kt:92] + * #### Generated from [EngineProcessModel.kt:93] */ data class MethodDescription ( val name: String, @@ -1299,7 +1305,7 @@ data class TestGeneratorParams ( /** - * #### Generated from [EngineProcessModel.kt:111] + * #### Generated from [EngineProcessModel.kt:112] */ data class WriteSarifReportArguments ( val testSetsId: Long, diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt index d68b73bf18..261c90de01 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt @@ -246,11 +246,13 @@ object UtTestsDialogProcessor { ModuleRootManager.getInstance(module).contentRoots.toList() } } + + val fileStorage = contentRoots.map { root -> root.url }.toTypedArray() process.getSpringBeanQualifiedNames( classpathForClassLoader, approach.config, - // TODO: consider passing it as an array - contentRoots.joinToString(File.pathSeparator), + fileStorage, + profileExpression = null, ) } } diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/process/EngineProcess.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/process/EngineProcess.kt index ba12ae4909..b8132ebe6a 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/process/EngineProcess.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/process/EngineProcess.kt @@ -143,10 +143,14 @@ class EngineProcess private constructor(val project: Project, private val classN engineModel.setupUtContext.startBlocking(SetupContextParams(classpathForUrlsClassloader)) } - fun getSpringBeanQualifiedNames(classpathList: List, config: String, fileStorage: String?): List { + fun getSpringBeanQualifiedNames( + classpathList: List, + config: String, + fileStorage: Array, + profileExpression: String?): List { assertReadAccessNotAllowed() return engineModel.getSpringBeanQualifiedNames.startBlocking( - GetSpringBeanQualifiedNamesParams(classpathList.toTypedArray(), config, fileStorage) + GetSpringBeanQualifiedNamesParams(classpathList.toTypedArray(), config, fileStorage, profileExpression) ).toList() } diff --git a/utbot-rd/src/main/rdgen/org/utbot/rd/models/EngineProcessModel.kt b/utbot-rd/src/main/rdgen/org/utbot/rd/models/EngineProcessModel.kt index d0e61d9ef6..d2bf647b42 100644 --- a/utbot-rd/src/main/rdgen/org/utbot/rd/models/EngineProcessModel.kt +++ b/utbot-rd/src/main/rdgen/org/utbot/rd/models/EngineProcessModel.kt @@ -87,7 +87,8 @@ object EngineProcessModel : Ext(EngineProcessRoot) { val getSpringBeanQualifiedNamesParams = structdef { field("classpath", array(PredefinedType.string)) field("config", PredefinedType.string) - field("fileStorage", PredefinedType.string.nullable) + field("fileStorage", array(PredefinedType.string)) + field("profileExpression", PredefinedType.string.nullable) } val methodDescription = structdef { field("name", PredefinedType.string) diff --git a/utbot-rd/src/main/rdgen/org/utbot/rd/models/SpringAnalyzerModel.kt b/utbot-rd/src/main/rdgen/org/utbot/rd/models/SpringAnalyzerModel.kt index 27dc2044e6..1a45ac24bb 100644 --- a/utbot-rd/src/main/rdgen/org/utbot/rd/models/SpringAnalyzerModel.kt +++ b/utbot-rd/src/main/rdgen/org/utbot/rd/models/SpringAnalyzerModel.kt @@ -7,9 +7,9 @@ object SpringAnalyzerRoot : Root() object SpringAnalyzerProcessModel : Ext(SpringAnalyzerRoot) { val springAnalyzerParams = structdef { - field("classpath", array(PredefinedType.string)) field("configuration", PredefinedType.string) - field("fileStorage", PredefinedType.string.nullable) + field("fileStorage", array(PredefinedType.string)) + field("profileExpression", PredefinedType.string.nullable) } val springAnalyzerResult = structdef { diff --git a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/api/ApplicationData.kt b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/api/ApplicationData.kt index de7bbb81aa..a2423019b2 100644 --- a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/api/ApplicationData.kt +++ b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/api/ApplicationData.kt @@ -3,8 +3,7 @@ package org.utbot.spring.api import java.net.URL class ApplicationData( - val classpath: Array, val configurationFile: String, - val fileStorage: String?, + val fileStorage: List, val profileExpression: String?, ) diff --git a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/generated/SpringAnalyzerProcessModel.Generated.kt b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/generated/SpringAnalyzerProcessModel.Generated.kt index 066dd632d2..0553c56637 100644 --- a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/generated/SpringAnalyzerProcessModel.Generated.kt +++ b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/generated/SpringAnalyzerProcessModel.Generated.kt @@ -48,7 +48,7 @@ class SpringAnalyzerProcessModel private constructor( } - const val serializationHash = 476832059519556525L + const val serializationHash = 1208896755601889441L } override val serializersOwner: ISerializersOwner get() = SpringAnalyzerProcessModel @@ -98,9 +98,9 @@ val IProtocol.springAnalyzerProcessModel get() = getOrCreateExtension(SpringAnal * #### Generated from [SpringAnalyzerModel.kt:9] */ data class SpringAnalyzerParams ( - val classpath: Array, val configuration: String, - val fileStorage: String? + val fileStorage: Array, + val profileExpression: String? ) : IPrintable { //companion @@ -109,16 +109,16 @@ data class SpringAnalyzerParams ( @Suppress("UNCHECKED_CAST") override fun read(ctx: SerializationCtx, buffer: AbstractBuffer): SpringAnalyzerParams { - val classpath = buffer.readArray {buffer.readString()} val configuration = buffer.readString() - val fileStorage = buffer.readNullable { buffer.readString() } - return SpringAnalyzerParams(classpath, configuration, fileStorage) + val fileStorage = buffer.readArray {buffer.readString()} + val profileExpression = buffer.readNullable { buffer.readString() } + return SpringAnalyzerParams(configuration, fileStorage, profileExpression) } override fun write(ctx: SerializationCtx, buffer: AbstractBuffer, value: SpringAnalyzerParams) { - buffer.writeArray(value.classpath) { buffer.writeString(it) } buffer.writeString(value.configuration) - buffer.writeNullable(value.fileStorage) { buffer.writeString(it) } + buffer.writeArray(value.fileStorage) { buffer.writeString(it) } + buffer.writeNullable(value.profileExpression) { buffer.writeString(it) } } @@ -134,27 +134,27 @@ data class SpringAnalyzerParams ( other as SpringAnalyzerParams - if (!(classpath contentDeepEquals other.classpath)) return false if (configuration != other.configuration) return false - if (fileStorage != other.fileStorage) return false + if (!(fileStorage contentDeepEquals other.fileStorage)) return false + if (profileExpression != other.profileExpression) return false return true } //hash code trait override fun hashCode(): Int { var __r = 0 - __r = __r*31 + classpath.contentDeepHashCode() __r = __r*31 + configuration.hashCode() - __r = __r*31 + if (fileStorage != null) fileStorage.hashCode() else 0 + __r = __r*31 + fileStorage.contentDeepHashCode() + __r = __r*31 + if (profileExpression != null) profileExpression.hashCode() else 0 return __r } //pretty print override fun print(printer: PrettyPrinter) { printer.println("SpringAnalyzerParams (") printer.indent { - print("classpath = "); classpath.print(printer); println() print("configuration = "); configuration.print(printer); println() print("fileStorage = "); fileStorage.print(printer); println() + print("profileExpression = "); profileExpression.print(printer); println() } printer.print(")") } diff --git a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/process/SpringAnalyzerProcess.kt b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/process/SpringAnalyzerProcess.kt index 59bf8b5264..922dd9d7d4 100644 --- a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/process/SpringAnalyzerProcess.kt +++ b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/process/SpringAnalyzerProcess.kt @@ -147,11 +147,11 @@ class SpringAnalyzerProcess private constructor( private val loggerModel: LoggerModel = onSchedulerBlocking { protocol.loggerModel } fun getBeanQualifiedNames( - classpath: List, configuration: String, - fileStorage: String?, + fileStorage: Array, + profileExpression: String?, ): List { - val params = SpringAnalyzerParams(classpath.toTypedArray(), configuration, fileStorage) + val params = SpringAnalyzerParams(configuration, fileStorage, profileExpression) val result = springAnalyzerModel.analyze.startBlocking(params) return result.beanTypes.toList() } diff --git a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/process/SpringAnalyzerProcessMain.kt b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/process/SpringAnalyzerProcessMain.kt index 68a47e26a0..5a19d80bb6 100644 --- a/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/process/SpringAnalyzerProcessMain.kt +++ b/utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/process/SpringAnalyzerProcessMain.kt @@ -42,9 +42,9 @@ suspend fun main(args: Array) = private fun SpringAnalyzerProcessModel.setup(watchdog: IdleWatchdog, realProtocol: IProtocol) { watchdog.measureTimeForActiveCall(analyze, "Analyzing Spring Application") { params -> val applicationData = ApplicationData( - params.classpath.toList().map { File(it).toURI().toURL() }.toTypedArray(), params.configuration, - params.fileStorage, + params.fileStorage.map { File(it).toURI().toURL() }, + params.profileExpression, ) SpringAnalyzerResult( SpringApplicationAnalyzer(applicationData).analyze().toTypedArray()