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, scriptCompilationConfiguration: ScriptCompilationConfiguration,
35 configuration: ScriptEvaluationConfiguration?): ResultWithDiagnostics<EvaluationResult> =
37 runInCoroutineContext {
39 blueprintScriptCompiler(script, scriptCompilationConfiguration)
41 evaluator(it, configuration)
42 }.onFailure { failedResult ->
43 val messages = failedResult.reports.joinToString("\n")
44 throw BluePrintProcessorException(messages)
49 open class BluePrintScriptEvaluator(private val scriptClassName: String) : ScriptEvaluator {
51 private val log = LoggerFactory.getLogger(BluePrintScriptEvaluator::class.java)!!
53 override suspend operator fun invoke(compiledScript: CompiledScript<*>,
54 scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
55 ): ResultWithDiagnostics<EvaluationResult> =
57 log.debug("Getting script class name($scriptClassName) from the compiled sources ")
59 val bluePrintCompiledScript = compiledScript as BluePrintCompiledScript
60 bluePrintCompiledScript.scriptClassFQName = scriptClassName
62 val classResult = compiledScript.getClass(scriptEvaluationConfiguration)
64 is ResultWithDiagnostics.Failure -> classResult
65 is ResultWithDiagnostics.Success -> {
67 val scriptClass = classResult.value
68 val args = ArrayList<Any?>()
69 scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.providedProperties)?.forEach {
72 scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.implicitReceivers)?.let {
75 scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.constructorArgs)?.let {
79 val instance = if (args.isNotEmpty()) {
80 scriptClass.java.constructors.single().newInstance(*args.toArray())
81 ?: throw BluePrintProcessorException("failed to create instance from the script")
83 scriptClass.createInstance()
86 log.debug("Created script instance of type ${instance.javaClass}")
88 ResultWithDiagnostics.Success(EvaluationResult(ResultValue.Value(scriptClass.qualifiedName!!,
89 instance, "", instance),
90 scriptEvaluationConfiguration))
93 } catch (e: Throwable) {
94 ResultWithDiagnostics.Failure(e.asDiagnostics("Error evaluating script"))