<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-script-runtime</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.jetbrains.kotlin</groupId>
+ <artifactId>kotlin-test-junit</artifactId>
+ </dependency>
</dependencies>
</project>
\ No newline at end of file
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.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler
import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
+import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer
import org.jetbrains.kotlin.config.*
import org.slf4j.LoggerFactory
import java.io.File
// 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()
+ return ResultWithDiagnostics.Failure(messageCollector.diagnostics)
}
}
compiler(script, scriptCompilationConfiguration)
.onSuccess {
evaluator(it, configuration)
+ }.onFailure { failedResult ->
+ val messages = failedResult.reports?.joinToString("\n")
+ throw BluePrintProcessorException(messages)
}
}
}
-
-open class BluePrintScriptEvaluator<T>(private val scriptClassName: String) : ScriptEvaluator {
+open class BluePrintScriptEvaluator(private val scriptClassName: String) : ScriptEvaluator {
private val log = LoggerFactory.getLogger(BluePrintScriptEvaluator::class.java)!!
scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
): ResultWithDiagnostics<EvaluationResult> =
try {
- log.info("Getting class name($scriptClassName) of type() from the compiled sources ")
+ log.debug("Getting script class name($scriptClassName) from the compiled sources ")
val bluePrintCompiledScript = compiledScript as BluePrintCompiledScript
bluePrintCompiledScript.scriptClassFQName = scriptClassName
args.addAll(it)
}
- val instance = scriptClass.java.newInstance() as? T
+ val instance = scriptClass.java.constructors.single().newInstance(*args.toArray())
?: throw BluePrintProcessorException("failed to create instance from the script")
- log.info("Created script instance successfully....")
+ log.info("Created script instance of type ${instance.javaClass}")
ResultWithDiagnostics.Success(EvaluationResult(ResultValue.Value(scriptClass.qualifiedName!!,
instance, "", instance),
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.api.*
import kotlin.script.experimental.jvm.jvm
-import kotlin.script.experimental.jvm.util.classpathFromClassloader
+import kotlin.script.experimental.jvm.util.classpathFromClasspathProperty
@KotlinScript(
fileExtension = "cba.kts",
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)
+ //classpathFromClassloader(BluePrintScripCompilationConfiguration::class.java.classLoader)
+ classpathFromClasspathProperty()
}
+ ide{
+ acceptedLocations(ScriptAcceptedLocation.Everywhere)
+ }
+
}
)
--- /dev/null
+/*
+ * 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.BluePrintConstants
+import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BluePrintScriptsService
+import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintContext
+import org.springframework.stereotype.Service
+import java.io.File
+import kotlin.script.experimental.api.ResultValue
+import kotlin.script.experimental.api.resultOrNull
+import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate
+
+@Service
+open class BluePrintScriptsServiceImpl : BluePrintScriptsService {
+
+ override fun <T> scriptInstance(blueprintContext: BluePrintContext, scriptClassName: String,
+ reCompile: Boolean): T {
+
+ val kotlinScriptPath = blueprintContext.rootPath.plus(File.separator)
+ .plus(BluePrintConstants.TOSCA_SCRIPTS_KOTLIN_DIR)
+
+ val compiledJar = kotlinScriptPath.plus(File.separator)
+ .plus(getBluePrintScriptsJarName(blueprintContext))
+
+ val scriptSource = BluePrintSourceCode()
+
+ val sources: MutableList<String> = arrayListOf()
+ sources.add(kotlinScriptPath)
+ scriptSource.blueprintKotlinSources = sources
+ scriptSource.moduleName = "${blueprintContext.name()}-${blueprintContext.version()}-cba-kts"
+ scriptSource.targetJarFile = File(compiledJar)
+ scriptSource.regenerate = reCompile
+
+ val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<BluePrintKotlinScript>()
+ val scriptEvaluator = BluePrintScriptEvaluator(scriptClassName)
+
+ val compiledResponse = BlueprintScriptingHost(scriptEvaluator).eval(scriptSource, compilationConfiguration,
+ null)
+
+ val returnValue = compiledResponse.resultOrNull()?.returnValue as? ResultValue.Value
+
+ return returnValue?.value!! as T
+ }
+
+}
+
+fun getBluePrintScriptsJarName(blueprintContext: BluePrintContext): String {
+ return "${blueprintContext.name()}-${blueprintContext.version()}-cba-kts.jar"
+}
\ No newline at end of file
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
class BlueprintScriptingHostTest {
- @Test
- @Ignore
- fun `test classpaths`() {
+ private fun viewClassPathInfo() {
println(" *********** classpathFromClass *********** ")
classpathFromClass(BlueprintScriptingHostTest::class.java.classLoader,
val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<BluePrintKotlinScript>()
- val scriptEvaluator = BluePrintScriptEvaluator<BlueprintFunctionNode<String, String>>(scriptClassName)
+ val scriptEvaluator = BluePrintScriptEvaluator(scriptClassName)
val scriptSource2 = BluePrintSourceCode()
scriptSource2.moduleName = "blueprint-test-script"