пятница, 19 апреля 2013 г.

5й- Практикум. Oracle ADF. Программный и декларативный подходы.ADFUtils, JSFUtils

Поскольку FrameWork ADF позиционирует себя как декларативный, то для многих операций можно использовать декларативный, программный - через java код и смешанный - java + декларативный подход. Когда начинается использование java, то удобно подключить в проект ADFUtils.java и JSFUtils.java. Они есть в поставке примера от Oracle - "FusionOrderDemo"



Декларативный подход реализуется исключительно перетаскиванием операторов из Data Controls на форму. Так "Commit" перетаскиванием на форму оператора от "AppModuleDataControl".



Как пример трех реализация показана операция добавления записи:
В коде два варианта выглядят так:
/**
     * Добавить запись (Java)
     * @param actionEvent
     */
    public void acAdd(ActionEvent actionEvent) {
        ApplicationModule am = ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl");
        ViewObject vo = am.findViewObject("JobsView1");
        Row row = vo.createRow();
        row.setAttribute("JobTitle", "Job Title");
        vo.insertRow(row);
    }

    /**
     * Добавить запись (Java + декларативный)
     * @param actionEvent
     */
    public void acAdd3(ActionEvent actionEvent) {
        ADFUtils.findOperation("CreateInsert").execute();
    }


Декларативный  вариант  сделан перетаскивание оператора "CreateInsert" ViewObject - JobsView1:
 Варианты поиска и удаления записи:
/**
     * Удаление записи
     * @param actionEvent
     */
    public void acDel(ActionEvent actionEvent) {
        ApplicationModule am = ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl");
        ViewObject vo = am.findViewObject("JobsView1");
        Row row = vo.getCurrentRow();
        row.remove();
    }

    /**
     * Поиск записи
     * @param actionEvent
     */
    public void acFind(ActionEvent actionEvent) {
        ApplicationModule am = ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl");
        ViewObject vo = am.findViewObject("JobsView1");
        Row[] byKey = vo.findByKey(new Key(new Object[] { getJobId() }), 1);
        if (byKey != null && byKey.length > 0) {
            vo.setCurrentRow(byKey[0]);
        }
    }

Фильтрация набора данных без изменения итогового набора данных и создание нового - отфильтрованного :
/**
   *  Фильтр данных
   * @param actionEvent
   */
    public void acFilter(ActionEvent actionEvent) {
        ApplicationModule am = ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl");
        ViewObject vo = am.findViewObject("JobsView1");
        ViewCriteria vc = vo.createViewCriteria();
        ViewCriteriaRow vcr = vc.createViewCriteriaRow();
        vcr.setAttribute("MinSalary", ">=" + getFilterValue());       
        vc.add(vcr);
        vc.setCriteriaMode(ViewCriteria.CRITERIA_MODE_CACHE);
        RowSet rs = (RowSet)vo.findByViewCriteria(vc, -1, ViewObject.QUERY_MODE_SCAN_VIEW_ROWS);
        if ((rs != null) && (rs.getRowCount() > 0)) {
            StringBuilder sb = new StringBuilder();            
            while (rs.hasNext()) {
                Row row = rs.next();
                sb.append(String.format("JobTitle %s, MinSalary %s \n", row.getAttribute("JobTitle"),
                                        row.getAttribute("MinSalary")));                                

            }
            setFilterResult(sb.toString());
        }
    }


Если нужно отфильтровать итоговый набор, то лучше использовать ViewCriteria.
Внешний вид примера:
 Полезное.
Для инициализации данных при создании новой записи удобно использовать Imp класс Entity

 переопределив метод - protected void create(AttributeList attributeList)

public class JobsImpl extends EntityImpl {
  
    protected void create(AttributeList attributeList) {
        super.create(attributeList);
        setJobId("XXX");
    }


Для формирования PK на базе сиквенса удобно использовать Groovy выражение на Entity
adf.object.seqNextVal("Name_Sequence")


Из java тоже самое можно сделать так:
SequenceImpl seq = new SequenceImpl(seqName, Transaction);
return seq.getSequenceNumber();

Исходник примера




1 комментарий: