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.apps.controllerblueprints.scripts
19 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException
20 import org.slf4j.LoggerFactory
22 import kotlin.script.experimental.api.*
23 import kotlin.script.experimental.host.BasicScriptingHost
24 import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
25 import kotlin.script.experimental.jvmhost.JvmScriptCompiler
26 import kotlin.script.experimental.jvmhost.impl.withDefaults
28 val blueprintScriptCompiler = JvmScriptCompiler(defaultJvmScriptingHostConfiguration,
29 BluePrintsCompilerProxy(defaultJvmScriptingHostConfiguration.withDefaults()))
31 open class BlueprintScriptingHost(evaluator: ScriptEvaluator) : BasicScriptingHost(blueprintScriptCompiler, evaluator) {
35 scriptCompilationConfiguration: ScriptCompilationConfiguration,
36 configuration: ScriptEvaluationConfiguration?
37 ): ResultWithDiagnostics<EvaluationResult> =
39 runInCoroutineContext {
41 compiler(script, scriptCompilationConfiguration)
43 evaluator(it, configuration)
49 open class BluePrintScriptEvaluator<T>(private val scriptClassName: String) : ScriptEvaluator {
51 private val log = LoggerFactory.getLogger(BluePrintScriptEvaluator::class.java)!!
53 override suspend operator fun invoke(
54 compiledScript: CompiledScript<*>,
55 scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
56 ): ResultWithDiagnostics<EvaluationResult> =
58 log.info("Getting class name($scriptClassName) of type() from the compiled sources ")
59 val bluePrintCompiledScript = compiledScript as BluePrintCompiledScript
60 bluePrintCompiledScript.scriptClassFQName = scriptClassName
62 val res = compiledScript.getClass(scriptEvaluationConfiguration)
64 is ResultWithDiagnostics.Failure -> res
65 is ResultWithDiagnostics.Success -> {
67 val scriptClass = res.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 = scriptClass.java.newInstance() as? T
80 ?: throw BluePrintProcessorException("failed to create instance from the script")
82 log.info("Created script instance successfully....")
84 ResultWithDiagnostics.Success(EvaluationResult(ResultValue.Value(scriptClass.qualifiedName!!,
85 instance, "", instance),
86 scriptEvaluationConfiguration))
89 } catch (e: Throwable) {
90 ResultWithDiagnostics.Failure(e.asDiagnostics("Error evaluating script"))