У меня есть свой пользовательский DSL, он выглядит так:
topElement {
first {
name "${nameProperty}"
address "${addressProperty}"
}
second {
something "something"
}
}
Вопрос касается свойств, например ${nameProperty}
.
У меня есть основной класс, и яЯ загружаю скрипт следующим образом:
Script dslScript = new GroovyShell().parse(dsl.text)
dslScript.setProperty("nameProperty", "value")
dslScript.setProperty("addressProperty", "addressValue")
ExpandoMetaClass emc = new ExpandoMetaClass(dslScript.class, false)
emc.initialize()
dslScript.metaClass = emc
dslScript.run()
Раньше каждое закрытие, которое я имел в этом DSL, было DELEGATE_FIRST
, и свойства работали.Я изменил все на DELEGATE_ONLY
(хотел избежать ситуации, когда кто-то вложит firsts
10 раз), и свойства перестали работать (No such property nameProperty for class FirstElementDelegate
).
Я думал, что просто сделаю closure.setProperty("nameProperty", "value")
,но это не работаетЯ пробовал closure.properties.put(...)
и многие другие вещи, но ничего не работает.
Есть ли способ добавить свойства в сценарий, чтобы они работали в каждой части сценария, независимо от контекста?
Уродливое решение, которое будет работать, но ужасно (просто чтобы проиллюстрировать, что я хочу): dsl.text.replace('${nameProperty}', 'value')