Resource Resolution Service
[ccsdk/cds.git] / components / core / src / main / kotlin / org / onap / ccsdk / apps / controllerblueprints / core / script / BlueprintScriptingHost.kt
1 /*
2  * Copyright © 2017-2018 AT&T Intellectual Property.
3  *
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package org.onap.ccsdk.apps.controllerblueprints.core.script
18
19 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException
20 import org.slf4j.LoggerFactory
21 import kotlin.script.experimental.api.*
22 import kotlin.script.experimental.host.BasicScriptingHost
23 import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
24 import kotlin.script.experimental.jvmhost.JvmScriptCompiler
25
26 val defaultBlueprintScriptCompiler = JvmScriptCompiler(defaultJvmScriptingHostConfiguration)
27
28 open class BlueprintScriptingHost(evaluator: ScriptEvaluator
29 ) : BasicScriptingHost(defaultBlueprintScriptCompiler, evaluator) {
30
31     override fun eval(
32             script: SourceCode,
33             scriptCompilationConfiguration: ScriptCompilationConfiguration,
34             configuration: ScriptEvaluationConfiguration?
35     ): ResultWithDiagnostics<EvaluationResult> =
36
37             runInCoroutineContext {
38
39                 compiler(script, scriptCompilationConfiguration)
40                         .onSuccess {
41                             evaluator(it, configuration)
42                         }
43             }
44 }
45
46
47 open class BluePrintScriptEvaluator(private val scriptClassName: String) : ScriptEvaluator {
48
49     val log = LoggerFactory.getLogger(BluePrintScriptEvaluator::class.java)!!
50
51     override suspend operator fun invoke(
52             compiledScript: CompiledScript<*>,
53             scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
54     ): ResultWithDiagnostics<EvaluationResult> =
55             try {
56                 val res = compiledScript.getClass(scriptEvaluationConfiguration)
57                 when (res) {
58                     is ResultWithDiagnostics.Failure -> res
59                     is ResultWithDiagnostics.Success -> {
60                         val scriptClass = res.value
61                         val args = ArrayList<Any?>()
62                         scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.providedProperties)?.forEach {
63                             args.add(it.value)
64                         }
65                         scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.implicitReceivers)?.let {
66                             args.addAll(it)
67                         }
68                         scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.constructorArgs)?.let {
69                             args.addAll(it)
70                         }
71
72                         val completeScriptClass = "Script\$$scriptClassName"
73                         log.info("Searching for class type($completeScriptClass)")
74                         /**
75                          * Search for Class Name
76                          */
77                         val instanceClass = scriptClass.java.classes
78                                 .single { it.name == completeScriptClass }
79                                 //.single { it.name == "Script\$SampleBlueprintsFunctionNode" }
80
81
82                         val instance = instanceClass.newInstance()
83                                 ?: throw BluePrintProcessorException("failed to create instance from the script")
84
85                         ResultWithDiagnostics.Success(EvaluationResult(ResultValue.Value(completeScriptClass,
86                                 instance, instance.javaClass.typeName),
87                                 scriptEvaluationConfiguration))
88                     }
89                 }
90             } catch (e: Throwable) {
91                 ResultWithDiagnostics.Failure(e.asDiagnostics("Error evaluating script"))
92             }
93 }