среда, 15 мая 2013 г.

9й - практикум. Oracle ADF. MultiTaskFlow, Shared Library, Динамическое подключение модулей.

Суть этого практикума в том, что он показывает, то с чем приходится иметь дело в реальной разработки больших проектов. А именно модульное построение приложения, динамическое подключение модулей.
Состоит приложение из оболочки AppShell, которая использует реестр taskFlow из таблицы БД, загружает его при старте,  и на его основе строит интерфейс (закладки в panelTabbed). Реализация функционала который размещается на вкладках, выполнен в разных shared library, которые самостоятельно загружены на WLS.


  Для примера используется схема HR на XE. Дополнительная таблица и данные для примера:
-- Create table
create table REGISTER_TF
(
  ID   VARCHAR2(100) not null,
  NAME VARCHAR2(50),
  PATH VARCHAR2(100) not null
)
;
-- Create/Recreate primary, unique and foreign key constraints
alter table REGISTER_TF
  add constraint PK_REGISTER_TF_ID primary key (ID)
;


Данные для примера (реестр taskFlow)

insert into register_tf  (id, name, path)values  ('task-flow-employees', 'Employees', '/WEB-INF/task-flow-employees.xml');
insert into register_tf  (id, name, path)values  ('task-flow-departments', 'Departments', '/WEB-INF/task-flow-departments.xml');
 
 Основу по мульти обработке во "фронте" обеспечивает - компонент MultiTaskFlow

MultiTaskFlow - привязан к списку
public class MultiBean {
    private List<TaskFlowBindingAttributes> mTaskFlowBindingAttrs = new ArrayList<TaskFlowBindingAttributes>(5);

    public MultiBean() {

    }

    public List<TaskFlowBindingAttributes> getTaskFlowList() {
        return mTaskFlowBindingAttrs;
    }

В свою очередь список загружается при старте из реестра

public String initList() {
        ViewObject vo = ADFUtils.findIterator("RegisterVOIterator").getViewObject();                
        vo.executeQuery();        
        Row row = vo.first();        
        while(row!=null){        
            TaskFlowBindingAttributes tfAttr = new TaskFlowBindingAttributes();
            tfAttr.setId((String)row.getAttribute("Name"));
            tfAttr.setTaskFlowId(new TaskFlowId((String)row.getAttribute("Path"), (String)row.getAttribute("Id")));
            mTaskFlowBindingAttrs.add(tfAttr);                    
            row = vo.next();
        }
        
        return null;
    }

Таким образом получим две закладки, которые в свою очередь загрузят две библиотеки.
К проекту AppShell не надо добавлять явно эти библиотеки, надо только указать их в "weblogic-application.xml"

Проекты AppLib простые и содержат по одному VO, AppModule, taskFlow, и  странице. Реализуют функционал для просмотра Employees и Departments соответственно.

taskFlow этих библиотек зарегистрированы в реестре, сами библиотеки размещены как shared library на WLS.
Все подключения в проектах используют  - DataSource "hr", на WLS создан JNDI -

Конечно в жизни загружать весь реестр taskFlow возможно не надо, а делать это по мере необходимости.
Подобные подходы помогут обеспечить большую гибкость в разработке и функционировании приложения.

Источники:

Configuring a Page To Render an Unknown Number of Regions
http://docs.oracle.com/cd/E16162_01/web.1112/e16182/taskflows_regions.htm#CHDBDDFE


Исходный код


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

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