суббота, 20 июля 2013 г.

15й - практикум. Oracle ADF. Groovy как динамический язык. Часть 2

Во второй части, я всего лишь сделаю вызов событий на groovy более универсальным и  буду использовать для этого способа, хранения событий в файлах, а не в БД. Это удобно когда  действительно начнется разработка и нужен будет контроль версий кода, поиск по текстам, merge кода и прочее.

Для запуска groovy кода из файла будем использовать  "GroovyScriptEngine".
На кнопке вызова события поместим два атрибута имя файла скрипта и имя метода в скрипте.




     <af:commandToolbarButton text="Calculate" id="ctbCalc"
         actionListener="#{myBean.runScript}">
         <f:attribute name="script" value="calc.groovy"/>
         <f:attribute name="method" value="onCalc"/>
     </af:commandToolbarButton>

а в бине на событии кнопки получим эти параметры и запустим скрипт


  public void runScript(ActionEvent actionEvent)
  {
        Object script = actionEvent.getComponent().getAttributes().get("script");
        Object method = actionEvent.getComponent().getAttributes().get("method");
        if(script!=null){
           ScriptHost sh = getScriptHost();           
           sh.invokeMethod((String)script, (String)method);
        }

    }

Вот так выглядит выполнение скрипта

public class ScriptHost {
    private GroovyScriptEngine gse;
    private String[] roots = new String[] { "C:\\Temp\\Script" };

    public void invokeMethod(String script, String method) {
        try {
            Script createScript = gse.createScript(script, binding);
            Object[] args = { };
            createScript.invokeMethod(method, args);
        } catch (ResourceException e) {
            System.out.println(e);
        } catch (ScriptException e) {
            System.out.println(e);
        }
    }

Так же в скрипте используются глобальнае объекты "model и bindings " переданные из java.
Скрипт: C:\Temp\Script\calc.groovy

def foo(value) {
    println "Calling function foo() with param ${value}";    
}

def onCalc(value) {
    println "Calling function onCalc!";    
    def emp = model.getEmployeesView();
    def row = emp.first();
    while(row != null){          
        println row.getAttribute('LastName');
        row.setAttribute('Salary', row.getAttribute('Salary') * bindings.getAttrValue('param1') ); 
        row  = emp.next();
    }
    
}

Форма

Источник
A dynamic language for the Java platform
http://groovy.codehaus.org/

Комментариев нет:

Отправить комментарий