blueprint scripting module
authorMuthuramalingam, Brinda Santh <bs2796@att.com>
Sat, 26 Jan 2019 01:17:35 +0000 (20:17 -0500)
committerMuthuramalingam, Brinda Santh <bs2796@att.com>
Mon, 28 Jan 2019 17:47:04 +0000 (12:47 -0500)
Change-Id: Ibe7602bdb6708d9adbe1aecd26eb14e24872f75d
Issue-ID: CCSDK-941
Signed-off-by: Muthuramalingam, Brinda Santh <bs2796@att.com>
12 files changed:
ms/controllerblueprints/application/src/main/resources/application.properties
ms/controllerblueprints/modules/blueprint-scripts/pom.xml [new file with mode: 0644]
ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BluePrintCompiledScript.kt [new file with mode: 0644]
ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BluePrintCompilerProxy.kt [new file with mode: 0644]
ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BluePrintScriptConfiguration.kt [new file with mode: 0644]
ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BlueprintScriptingHost.kt [new file with mode: 0644]
ms/controllerblueprints/modules/blueprint-scripts/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BlueprintScriptingHostTest.kt [new file with mode: 0644]
ms/controllerblueprints/modules/blueprint-scripts/src/test/resources/scripts1/simple.cba.kts [new file with mode: 0644]
ms/controllerblueprints/modules/blueprint-scripts/src/test/resources/scripts2/simple.cba.kts [new file with mode: 0644]
ms/controllerblueprints/modules/pom.xml
ms/controllerblueprints/modules/service/pom.xml
ms/controllerblueprints/parent/pom.xml

index b6d509c..ec61be4 100755 (executable)
@@ -41,7 +41,7 @@ spring.jpa.properties.hibernate.use_sql_comments=true
 spring.jpa.properties.hibernate.format_sql=true
 
 # spring.datasource.url, spring.datasource.username,spring.datasource.password  may be overridden by ENV variables
-spring.datasource.url=jdbc:mysql://db:3306/sdnctl
+spring.datasource.url=jdbc:mysql://localhost:3306/sdnctl
 spring.datasource.username=sdnctl
 spring.datasource.password=sdnctl
 spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
diff --git a/ms/controllerblueprints/modules/blueprint-scripts/pom.xml b/ms/controllerblueprints/modules/blueprint-scripts/pom.xml
new file mode 100644 (file)
index 0000000..46c88b4
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright © 2017-2018 AT&T Intellectual Property.
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>modules</artifactId>
+        <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
+        <version>0.4.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>blueprint-scripts</artifactId>
+    <name>Controller Blueprints Scripts</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
+            <artifactId>resource-dict</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-compiler-embeddable</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-scripting-jvm-host</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.jetbrains.kotlin</groupId>
+                    <artifactId>kotlin-compiler</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-script-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-script-runtime</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BluePrintCompiledScript.kt b/ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BluePrintCompiledScript.kt
new file mode 100644 (file)
index 0000000..8ac915b
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.scripts
+
+import java.io.File
+import java.io.Serializable
+import java.net.URL
+import java.net.URLClassLoader
+import kotlin.reflect.KClass
+import kotlin.script.experimental.api.*
+
+open class BluePrintCompiledScript<out JarFile : File>(
+        private val scriptCompilationConfiguration: ScriptCompilationConfiguration,
+        private val compiledJar: File) :
+        CompiledScript<JarFile>, Serializable {
+
+    lateinit var scriptClassFQName: String
+
+    override val compilationConfiguration: ScriptCompilationConfiguration
+        get() = scriptCompilationConfiguration
+
+    override suspend fun getClass(scriptEvaluationConfiguration: ScriptEvaluationConfiguration?): ResultWithDiagnostics<KClass<*>> = try {
+
+        val baseClassLoader = Thread.currentThread().contextClassLoader
+
+        val urls = arrayListOf<URL>()
+        urls.add(compiledJar.toURI().toURL())
+        val classLoaderWithDependencies = URLClassLoader(urls.toTypedArray(), baseClassLoader)
+
+        val clazz = classLoaderWithDependencies.loadClass(scriptClassFQName).kotlin
+        clazz.asSuccess()
+    } catch (e: Throwable) {
+        ResultWithDiagnostics.Failure(
+                ScriptDiagnostic(
+                        "Unable to instantiate class $scriptClassFQName",
+                        exception = e
+                )
+        )
+    }
+
+}
+
diff --git a/ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BluePrintCompilerProxy.kt b/ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BluePrintCompilerProxy.kt
new file mode 100644 (file)
index 0000000..7e9e868
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.scripts
+
+import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer
+import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
+import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots
+import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback
+import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
+import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
+import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
+import org.jetbrains.kotlin.cli.common.messages.MessageCollector
+import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
+import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
+import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler
+import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
+import org.jetbrains.kotlin.config.*
+import org.slf4j.LoggerFactory
+import java.io.File
+import kotlin.script.experimental.api.*
+import kotlin.script.experimental.host.ScriptingHostConfiguration
+import kotlin.script.experimental.jvm.util.classpathFromClasspathProperty
+import kotlin.script.experimental.jvmhost.KJvmCompilerProxy
+
+open class BluePrintsCompilerProxy(private val hostConfiguration: ScriptingHostConfiguration) : KJvmCompilerProxy {
+
+    private val log = LoggerFactory.getLogger(BluePrintsCompilerProxy::class.java)!!
+
+    override fun compile(script: SourceCode, scriptCompilationConfiguration: ScriptCompilationConfiguration)
+            : ResultWithDiagnostics<CompiledScript<*>> {
+
+        val messageCollector = ScriptDiagnosticsMessageCollector()
+
+        fun failure(vararg diagnostics: ScriptDiagnostic): ResultWithDiagnostics.Failure =
+                ResultWithDiagnostics.Failure(*messageCollector.diagnostics.toTypedArray(), *diagnostics)
+
+        // Compile the Code
+        try {
+
+            log.trace("Scripting Host Configuration : $hostConfiguration")
+
+            setIdeaIoUseFallback()
+
+            val blueprintSourceCode = script as BluePrintSourceCode
+
+            val compiledJarFile = blueprintSourceCode.targetJarFile
+
+            if (!compiledJarFile.exists() || blueprintSourceCode.regenerate) {
+
+                var environment: KotlinCoreEnvironment? = null
+
+                val rootDisposable = Disposer.newDisposable()
+
+                val compilerConfiguration = CompilerConfiguration().apply {
+
+                    put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
+                    put(CommonConfigurationKeys.MODULE_NAME, blueprintSourceCode.moduleName)
+                    put(JVMConfigurationKeys.OUTPUT_JAR, compiledJarFile)
+                    put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, false)
+
+                    // Load Current Class loader to Compilation Class loader
+                    val currentClassLoader = classpathFromClasspathProperty()
+                    currentClassLoader?.forEach {
+                        add(CLIConfigurationKeys.CONTENT_ROOTS, JvmClasspathRoot(it))
+                    }
+
+                    // Add all Kotlin Sources
+                    addKotlinSourceRoots(blueprintSourceCode.blueprintKotlinSources)
+
+                    languageVersionSettings = LanguageVersionSettingsImpl(
+                            LanguageVersion.LATEST_STABLE, ApiVersion.LATEST_STABLE, mapOf(AnalysisFlags.skipMetadataVersionCheck to true)
+                    )
+                }
+
+                //log.info("Executing with compiler configuration : $compilerConfiguration")
+
+                environment = KotlinCoreEnvironment.createForProduction(rootDisposable, compilerConfiguration,
+                        EnvironmentConfigFiles.JVM_CONFIG_FILES)
+
+                // Compile Kotlin Sources
+                val compiled = KotlinToJVMBytecodeCompiler.compileBunchOfSources(environment)
+
+                log.info("Generated jar(${compiledJarFile.absolutePath}) status : $compiled}")
+
+                val analyzerWithCompilerReport = AnalyzerWithCompilerReport(messageCollector,
+                        environment.configuration.languageVersionSettings)
+
+                if (analyzerWithCompilerReport.hasErrors()) {
+                    return failure()
+                }
+            }
+
+            val res = BluePrintCompiledScript<File>(scriptCompilationConfiguration, compiledJarFile)
+
+            return ResultWithDiagnostics.Success(res, messageCollector.diagnostics)
+
+        } catch (ex: Throwable) {
+            return failure(ex.asDiagnostics())
+        }
+    }
+}
+
+class ScriptDiagnosticsMessageCollector : MessageCollector {
+
+    private val _diagnostics = arrayListOf<ScriptDiagnostic>()
+
+    val diagnostics: List<ScriptDiagnostic> get() = _diagnostics
+
+    override fun clear() {
+        _diagnostics.clear()
+    }
+
+    override fun hasErrors(): Boolean =
+            _diagnostics.any { it.severity == ScriptDiagnostic.Severity.ERROR }
+
+
+    override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation?) {
+        val mappedSeverity = when (severity) {
+            CompilerMessageSeverity.EXCEPTION,
+            CompilerMessageSeverity.ERROR -> ScriptDiagnostic.Severity.ERROR
+            CompilerMessageSeverity.STRONG_WARNING,
+            CompilerMessageSeverity.WARNING -> ScriptDiagnostic.Severity.WARNING
+            CompilerMessageSeverity.INFO -> ScriptDiagnostic.Severity.INFO
+            CompilerMessageSeverity.LOGGING -> ScriptDiagnostic.Severity.DEBUG
+            else -> null
+        }
+        if (mappedSeverity != null) {
+            val mappedLocation = location?.let {
+                if (it.line < 0 && it.column < 0) null // special location created by CompilerMessageLocation.create
+                else SourceCode.Location(SourceCode.Position(it.line, it.column))
+            }
+            _diagnostics.add(ScriptDiagnostic(message, mappedSeverity, location?.path, mappedLocation))
+        }
+    }
+}
+
diff --git a/ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BluePrintScriptConfiguration.kt b/ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BluePrintScriptConfiguration.kt
new file mode 100644 (file)
index 0000000..3b3a590
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.scripts
+
+import java.io.File
+import kotlin.script.experimental.annotations.KotlinScript
+import kotlin.script.experimental.api.ScriptCompilationConfiguration
+import kotlin.script.experimental.api.SourceCode
+import kotlin.script.experimental.api.defaultImports
+import kotlin.script.experimental.jvm.jvm
+import kotlin.script.experimental.jvm.util.classpathFromClassloader
+
+@KotlinScript(
+        fileExtension = "cba.kts",
+        compilationConfiguration = BluePrintScripCompilationConfiguration::class,
+        displayName = "Controller Blueprint Archive Kotlin Scripts"
+)
+abstract class BluePrintKotlinScript
+
+object BluePrintScripCompilationConfiguration : ScriptCompilationConfiguration(
+        {
+            defaultImports(
+                    "org.onap.ccsdk.apps.controllerblueprints.core.*",
+                    "org.onap.ccsdk.apps.controllerblueprints.core.data.*",
+                    "org.onap.ccsdk.apps.controllerblueprints.core.interfaces.*",
+                    "org.onap.ccsdk.apps.controllerblueprints.core.services.*",
+                    "org.onap.ccsdk.apps.controllerblueprints.core.utils.*")
+            jvm {
+                classpathFromClassloader(BluePrintScripCompilationConfiguration::class.java.classLoader)
+            }
+        }
+)
+
+open class BluePrintSourceCode : SourceCode {
+    lateinit var blueprintKotlinSources: MutableList<String>
+    lateinit var moduleName: String
+    lateinit var targetJarFile: File
+    var regenerate: Boolean = false
+
+    override val text: String
+        get() = ""
+
+    override val locationId: String? = null
+
+    override val name: String?
+        get() = moduleName
+}
diff --git a/ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BlueprintScriptingHost.kt b/ms/controllerblueprints/modules/blueprint-scripts/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BlueprintScriptingHost.kt
new file mode 100644 (file)
index 0000000..59ce4ab
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.scripts
+
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException
+import org.slf4j.LoggerFactory
+import java.util.*
+import kotlin.script.experimental.api.*
+import kotlin.script.experimental.host.BasicScriptingHost
+import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
+import kotlin.script.experimental.jvmhost.JvmScriptCompiler
+import kotlin.script.experimental.jvmhost.impl.withDefaults
+
+val blueprintScriptCompiler = JvmScriptCompiler(defaultJvmScriptingHostConfiguration,
+        BluePrintsCompilerProxy(defaultJvmScriptingHostConfiguration.withDefaults()))
+
+open class BlueprintScriptingHost(evaluator: ScriptEvaluator) : BasicScriptingHost(blueprintScriptCompiler, evaluator) {
+
+    override fun eval(
+            script: SourceCode,
+            scriptCompilationConfiguration: ScriptCompilationConfiguration,
+            configuration: ScriptEvaluationConfiguration?
+    ): ResultWithDiagnostics<EvaluationResult> =
+
+            runInCoroutineContext {
+
+                compiler(script, scriptCompilationConfiguration)
+                        .onSuccess {
+                            evaluator(it, configuration)
+                        }
+            }
+}
+
+
+open class BluePrintScriptEvaluator<T>(private val scriptClassName: String) : ScriptEvaluator {
+
+    private val log = LoggerFactory.getLogger(BluePrintScriptEvaluator::class.java)!!
+
+    override suspend operator fun invoke(
+            compiledScript: CompiledScript<*>,
+            scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
+    ): ResultWithDiagnostics<EvaluationResult> =
+            try {
+                log.info("Getting class name($scriptClassName) of type() from the compiled sources ")
+                val bluePrintCompiledScript = compiledScript as BluePrintCompiledScript
+                bluePrintCompiledScript.scriptClassFQName = scriptClassName
+
+                val res = compiledScript.getClass(scriptEvaluationConfiguration)
+                when (res) {
+                    is ResultWithDiagnostics.Failure -> res
+                    is ResultWithDiagnostics.Success -> {
+
+                        val scriptClass = res.value
+                        val args = ArrayList<Any?>()
+                        scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.providedProperties)?.forEach {
+                            args.add(it.value)
+                        }
+                        scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.implicitReceivers)?.let {
+                            args.addAll(it)
+                        }
+                        scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.constructorArgs)?.let {
+                            args.addAll(it)
+                        }
+
+                        val instance = scriptClass.java.newInstance() as? T
+                                ?: throw BluePrintProcessorException("failed to create instance from the script")
+
+                        log.info("Created script instance successfully....")
+
+                        ResultWithDiagnostics.Success(EvaluationResult(ResultValue.Value(scriptClass.qualifiedName!!,
+                                instance, "", instance),
+                                scriptEvaluationConfiguration))
+                    }
+                }
+            } catch (e: Throwable) {
+                ResultWithDiagnostics.Failure(e.asDiagnostics("Error evaluating script"))
+            }
+}
\ No newline at end of file
diff --git a/ms/controllerblueprints/modules/blueprint-scripts/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BlueprintScriptingHostTest.kt b/ms/controllerblueprints/modules/blueprint-scripts/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/scripts/BlueprintScriptingHostTest.kt
new file mode 100644 (file)
index 0000000..4b6f2a4
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.scripts
+
+
+import org.apache.commons.io.FileUtils
+import org.junit.Ignore
+import org.junit.Test
+import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BlueprintFunctionNode
+import java.io.File
+import kotlin.script.experimental.jvm.util.classpathFromClass
+import kotlin.script.experimental.jvm.util.classpathFromClassloader
+import kotlin.script.experimental.jvm.util.classpathFromClasspathProperty
+import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate
+
+class BlueprintScriptingHostTest {
+
+    @Test
+    @Ignore
+    fun `test classpaths`() {
+
+        println(" *********** classpathFromClass  *********** ")
+        classpathFromClass(BlueprintScriptingHostTest::class.java.classLoader,
+                BlueprintScriptingHostTest::class)!!
+                .forEach(::println)
+
+        println(" *********** classpathFromClassloader  *********** ")
+        classpathFromClassloader(BlueprintScriptingHostTest::class.java.classLoader)!!
+                .forEach(::println)
+
+        println(" *********** classpathFromClasspathProperty  *********** ")
+        classpathFromClasspathProperty()!!
+                .forEach(::println)
+    }
+
+    @Test
+    fun `test same script two folders`() {
+
+        FileUtils.forceMkdir(File("target/scripts1/"))
+        FileUtils.forceMkdir(File("target/scripts2/"))
+
+        val scriptSource1 = BluePrintSourceCode()
+        scriptSource1.moduleName = "blueprint-test-script"
+
+        scriptSource1.targetJarFile = File("target/scripts1/blueprint-script-generated.jar")
+        val sources1: MutableList<String> = arrayListOf()
+        sources1.add("src/test/resources/scripts1")
+        scriptSource1.blueprintKotlinSources = sources1
+
+        val scriptClassName = "Simple_cba\$SampleComponentFunction"
+
+        val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<BluePrintKotlinScript>()
+
+        val scriptEvaluator = BluePrintScriptEvaluator<BlueprintFunctionNode<String, String>>(scriptClassName)
+
+        val scriptSource2 = BluePrintSourceCode()
+        scriptSource2.moduleName = "blueprint-test-script"
+
+        scriptSource2.targetJarFile = File("target/scripts2/blueprint-script-generated.jar")
+        val sources2: MutableList<String> = arrayListOf()
+        sources2.add("src/test/resources/scripts2")
+        scriptSource2.blueprintKotlinSources = sources2
+
+        for (i in 1..2) {
+            val evalResponse = BlueprintScriptingHost(scriptEvaluator).eval(scriptSource1, compilationConfiguration,
+                    null)
+        }
+
+        for (i in 1..2) {
+            val evalResponse = BlueprintScriptingHost(scriptEvaluator).eval(scriptSource2, compilationConfiguration,
+                    null)
+        }
+    }
+}
\ No newline at end of file
diff --git a/ms/controllerblueprints/modules/blueprint-scripts/src/test/resources/scripts1/simple.cba.kts b/ms/controllerblueprints/modules/blueprint-scripts/src/test/resources/scripts1/simple.cba.kts
new file mode 100644 (file)
index 0000000..9f61c64
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.onap.ccsdk.apps.controllerblueprints.core.asJsonPrimitive
+import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate
+import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BlueprintFunctionNode
+import org.springframework.stereotype.Service
+
+@Service
+open class SampleComponentFunction : BlueprintFunctionNode<String, String> {
+
+    override fun getName(): String {
+        println("Printing Name....." + "sample".asJsonPrimitive())
+        return "my Name"
+    }
+
+    override fun prepareRequest(executionRequest: String): String {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun process(executionRequest: String) {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun recover(runtimeException: RuntimeException, executionRequest: String) {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun prepareResponse(): String {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun apply(t: String): String {
+        return "Script 1 response - $t"
+    }
+}
+
+val blueprintFunction = SampleComponentFunction()
+
+val serviceTemplate = ServiceTemplate()
+
+println("Simple script printing....")
diff --git a/ms/controllerblueprints/modules/blueprint-scripts/src/test/resources/scripts2/simple.cba.kts b/ms/controllerblueprints/modules/blueprint-scripts/src/test/resources/scripts2/simple.cba.kts
new file mode 100644 (file)
index 0000000..8451725
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.onap.ccsdk.apps.controllerblueprints.core.asJsonPrimitive
+import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate
+import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BlueprintFunctionNode
+import org.springframework.stereotype.Service
+
+@Service
+open class SampleComponentFunction : BlueprintFunctionNode<String, String> {
+
+    override fun getName(): String {
+        println("Printing Name....." + "sample".asJsonPrimitive())
+        return "my Name"
+    }
+
+    override fun prepareRequest(executionRequest: String): String {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun process(executionRequest: String) {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun recover(runtimeException: RuntimeException, executionRequest: String) {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun prepareResponse(): String {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun apply(t: String): String {
+       return "Script 2 response - $t"
+    }
+}
+
+val blueprintFunction = SampleComponentFunction()
+
+val serviceTemplate = ServiceTemplate()
+
+println("Simple script printing....")
index 3857ef5..834db24 100644 (file)
@@ -30,6 +30,7 @@
         <module>service</module>
         <module>blueprint-validation</module>
         <module>db-resources</module>
+        <module>blueprint-scripts</module>
     </modules>
 
     <build>
index 9868b17..73fe073 100644 (file)
     </properties>
 
     <dependencies>
-        <dependency>
-            <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
-            <artifactId>core</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
             <artifactId>db-resources</artifactId>
@@ -44,7 +40,7 @@
         </dependency>
         <dependency>
             <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
-            <artifactId>resource-dict</artifactId>
+            <artifactId>blueprint-scripts</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.velocity</groupId>
index 578a0c7..8cbc98e 100644 (file)
     <name>Controller Blueprints Parent</name>
     <packaging>pom</packaging>
     <properties>
-        <spring.boot.version>2.1.1.RELEASE</spring.boot.version>
-        <spring.version>5.1.3.RELEASE</spring.version>
-        <kotlin.version>1.3.11</kotlin.version>
-        <kotlin.maven.version>1.3.11</kotlin.maven.version>
-        <kotlin.couroutines.version>1.1.0</kotlin.couroutines.version>
+        <spring.boot.version>2.1.2.RELEASE</spring.boot.version>
+        <spring.version>5.1.4.RELEASE</spring.version>
+        <kotlin.version>1.3.20</kotlin.version>
+        <kotlin.maven.version>1.3.20</kotlin.maven.version>
+        <kotlin.couroutines.version>1.1.1</kotlin.couroutines.version>
         <grpc.version>1.18.0</grpc.version>
         <protobuff.java.utils.version>3.6.1</protobuff.java.utils.version>
         <eelf.version>1.0.0</eelf.version>
                 <artifactId>kotlin-stdlib-common</artifactId>
                 <version>${kotlin.version}</version>
             </dependency>
+            <!--Use kotlin-compiler-embeddable instead koltin-compiler wrap-->
+            <!--guava dependency inside kotlin-compiler creating classpath issues at runtime-->
             <dependency>
                 <groupId>org.jetbrains.kotlin</groupId>
                 <artifactId>kotlin-scripting-jvm-host</artifactId>
                 <version>${kotlin.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.jetbrains.kotlin</groupId>
+                        <artifactId>kotlin-compile</artifactId>
+                    </exclusion>
+                </exclusions>
             </dependency>
             <dependency>
                 <groupId>org.jetbrains.kotlin</groupId>
                 <artifactId>kotlin-compiler-embeddable</artifactId>
                 <version>${kotlin.version}</version>
-                <scope>runtime</scope>
             </dependency>
             <dependency>
                 <groupId>org.jetbrains.kotlin</groupId>
             </dependency>
             <dependency>
                 <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
-                <artifactId>service</artifactId>
+                <artifactId>resource-dict</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
-                <artifactId>application</artifactId>
+                <artifactId>db-resources</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
-                <artifactId>resource-dict</artifactId>
+                <artifactId>blueprint-validation</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
-                <artifactId>db-resources</artifactId>
+                <artifactId>blueprint-scripts</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
-                <artifactId>blueprint-validation</artifactId>
+                <artifactId>service</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
+                <artifactId>application</artifactId>
                 <version>${project.version}</version>
             </dependency>
 
             <groupId>com.jayway.jsonpath</groupId>
             <artifactId>json-path</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger2</artifactId>