Hello,

I will narrow down my questions.  If a groovy script in openHAB calls 
`scriptExtension.importPreset("RuleSupport")`, then the system executes 
essentially in JSR 223 context:

scriptEngine.put("Configuration", 
org.openhab.core.config.core.Configuration.class)
scriptEngine.put("TriggerBuilder", 
org.openhab.core.automation.util.TriggerBuilder.class)

where scriptEngine was returned by GroovyScriptEngineImpl() (before 
`scriptExtension.importPreset("RuleSupport")` was executed).

Why afterwards this works from that started groovy script:

scriptExtension.importPreset("RuleSupport")
var r = 
TriggerBuilder.create().withId("trig2").withTypeUID("core.ItemStateChangeTrigger").build()
var c = Configuration.class

but this produces an error:

scriptExtension.importPreset("RuleSupport")
var c = new Configuration()

Error during evaluation of script '/etc/openhab/automation/jsr223/u.groovy': 
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/etc/openhab/automation/jsr223/u.groovy: 2: unable to resolve class 
Configuration
 @ line 2, column 9.
   var c = new Configuration()
           ^

1 error

How can this be made working?

Greetings // Дилян

-----Original Message-----
From: Дилян Палаузов <[email protected]>
To: [email protected]
Subject: What is the purpose of CompilationCustomizer.getPhase(); Can 
importCustomizer() add imports, after groovy file execution has started, based 
on the instructions in that groovy file?
Date: 04/10/25 21:47:31

Hello,

* what is the purpose of CompilationCustomizer.getPhase(), which is not 
described at 
https://docs.groovy-lang.org/4.0.0/html/api/org/codehaus/groovy/control/customizers/CompilationCustomizer.html#getPhase()
 ?

OpenHAB integrates Groovy 4.0.28 ala JSR223 by utilizing two files - 
https://github.com/openhab/openhab-addons/tree/main/bundles/org.openhab.automation.groovyscripting/src/main/java/org/openhab/automation/groovyscripting/internal
 .

When a .groovy input file is proceeded, first some default things are inserted 
into the scripting engine in GroovyScriptEngineFactory.scopeValues().  If the 
thing is a variable, then it is inserted with scriptEngine.put(variable-name, 
value).  If the thing is a class, then the class is added to an 
ImportCustomizer, and the latter is at the end 
.addCompilationCustomizers(importCustomizer).  This works!

After the script execution has started, in OpenHAB JSR223 one can execute 
`se.importPreset("RuleSupport")` - cf 
https://www.openhab.org/docs/configuration/jsr223.html - to add further things 
in the context.  Currently GroovyScriptEngineFactory.scopeValues() does again 
for classes create a new ImportCustomizer, addImport, e.g. 
addImport("TriggerBuilder", org.openhab.core.automation.util.TriggerBuilder).  
This does not work, however, and the question is why: with the content of file 
t.groovy:n

se.importPreset("RuleSupport")
var k = TriggerBuilder.create()

produces an error:

javax.script.ScriptException: groovy.lang.MissingPropertyException: No such 
property: TriggerBuilder for class: t

* As far as I see ImportCustomizer has always phase=CONVERSION.  Does this 
mean, that ImportCustomizer can only be adjusted before script execution has 
started?
* What should above `se.importPreset("RuleSupport")` do, so that the second 
line assumes that `import org.openhab.core.automation.util.TriggerBuilder;` is 
executed after the first line and before the second line?

Thanks // Дилян

Reply via email to