2 * Copyright © 2017-2018 AT&T Intellectual Property.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.ccsdk.cds.controllerblueprints.core.scripts
19 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
20 import org.slf4j.LoggerFactory
22 import kotlin.reflect.full.createInstance
23 import kotlin.script.experimental.api.*
24 import kotlin.script.experimental.host.BasicScriptingHost
25 import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
26 import kotlin.script.experimental.jvmhost.JvmScriptCompiler
27 import kotlin.script.experimental.jvmhost.impl.withDefaults
29 val blueprintScriptCompiler = JvmScriptCompiler(defaultJvmScriptingHostConfiguration,
30 BluePrintsCompilerProxy(defaultJvmScriptingHostConfiguration.withDefaults()))
32 open class BlueprintScriptingHost(evaluator: ScriptEvaluator) : BasicScriptingHost(blueprintScriptCompiler, evaluator) {
34 override fun eval(script: SourceCode, compilationConfiguration: ScriptCompilationConfiguration,
35 evaluationConfiguration: ScriptEvaluationConfiguration?): ResultWithDiagnostics<EvaluationResult> =
37 runInCoroutineContext {
38 blueprintScriptCompiler(script, compilationConfiguration)
39 .onSuccess { compiledScript ->
40 evaluator(compiledScript, evaluationConfiguration ?: ScriptEvaluationConfiguration.Default)
41 }.onFailure { failedResult ->
42 val messages = failedResult.reports.joinToString("\n")
43 throw BluePrintProcessorException(messages)
48 open class BluePrintScriptEvaluator(private val scriptClassName: String) : ScriptEvaluator {
50 private val log = LoggerFactory.getLogger(BluePrintScriptEvaluator::class.java)!!
52 override suspend operator fun invoke(compiledScript: CompiledScript<*>,
53 scriptEvaluationConfiguration: ScriptEvaluationConfiguration
54 ): ResultWithDiagnostics<EvaluationResult> =
56 log.debug("Getting script class name($scriptClassName) from the compiled sources ")
58 val bluePrintCompiledScript = compiledScript as BluePrintCompiledScript
59 bluePrintCompiledScript.scriptClassFQName = scriptClassName
61 when (val classResult = compiledScript.getClass(scriptEvaluationConfiguration)) {
62 is ResultWithDiagnostics.Failure -> classResult
63 is ResultWithDiagnostics.Success -> {
65 val scriptClass = classResult.value
66 val args = ArrayList<Any?>()
67 scriptEvaluationConfiguration.get(ScriptEvaluationConfiguration.providedProperties)?.forEach {
70 scriptEvaluationConfiguration.get(ScriptEvaluationConfiguration.implicitReceivers)?.let {
73 scriptEvaluationConfiguration.get(ScriptEvaluationConfiguration.constructorArgs)?.let {
77 val instance = if (args.isNotEmpty()) {
78 scriptClass.java.constructors.single().newInstance(*args.toArray())
79 ?: throw BluePrintProcessorException("failed to create instance from the script")
81 scriptClass.createInstance()
84 log.debug("Created script instance of type ${instance.javaClass}")
86 ResultWithDiagnostics.Success(EvaluationResult(ResultValue.Value(scriptClass.qualifiedName!!,
87 instance, "", instance),
88 scriptEvaluationConfiguration))
91 } catch (e: Throwable) {
92 ResultWithDiagnostics.Failure(e.asDiagnostics("Error evaluating script"))