【iDempiere/ZK Lab】お気に入りをクリックした時の処理フロー

 ここでは、iDempiere(アイデンピエレ)のWEB-UIのサイドメニューに表示されているお気に入りのメニューをクリックした時の処理フローを調査&研究したいと思います。

ZKによる前処理

【DHUS】DHtmlUpdateServlet

DHtmlUpdateServlet > HttpServlet > GenericServlet(I/F)Servlet,ServletConfig > Object

DHtmlUpdateSrvletクラスはZKのライブラリでorg.zkoss.zl.library>zk.jar>org.zkoss.zk.au.httpパッケージに含まれています。

サーバーから命令を受取り、クライアントに返すのに使用します。DHtmlUpdateSrvletと呼ばれていますが、HTTPベースで通信する全ての種類のクライアント(AjaxやMIL(Mobile Interactive Language,その他)で使用されます。

10:protected void doPost(HttpServletRequest request, HttpServletResponse response)

↓10-10:doGet(request,response) → 20

20:protected void doGet(HttpServletRequest request, HttpServletResponse response)

↓20-90:final Object old = I18Ns.setup(sess, request, response, "UTF-8") 

↓20-94:porcess(sess, request, response, _compress) → 30

↓20-96:I18Ns.cleanup(request, old) 

↑10-10に戻る。

30:public void process(Session sess, HttpServletRequest request, HttpServletResponse response, boolean compress)

↓30-30:Desktop desktop = getDesktop(sess, dtid)

↓30-90:final AuWriter out = AuWriters.newInstance()

out.setCompress(compress)

out.open(request, response)

↓30-91:wappc.getUiEngine().execUpdate(exec, aureqs, out) →【UEI】10

↓30-96:out.close(request, response) →【HAW】10 

↑20-94に戻る

【HAW】HttpAuWriter

◆HttpAuWriter (I/F)AuWriter > Object

HeepAuWriterクラスはZKのライブラリでorg.zkoss.zl.library>zk.jar>org.zkoss.zk.au.httpパッケージに含まれています。このWriterはアウトプットをクライアントに返すのに使用します。

10:public void close(Object request, Object response)

↓10-10:flush(request, response, _compress) → 20

【DHUS】30-96に戻る

20:protected void flush(Object request, Object response, boolean bCompress)

↓20-30:final HttpServletResponse hres = (HttpServletResponse)response;

↓20-90:hres.flushBuffer()

↑10-10に戻る

 

【UEI】UiEngineImpl

UiEngineImpl (I/F)UiEngine > Object

UiEngineImplクラスはZKのライブラリでorg.zkoss.zl.library>zk.jar>org.zkoss.zk.ui.implパッケージに含まれている。UiEngineの実装クラスです。コンポーネントの作成及び更新を行います。

10:public void execUpdate(Execution exec, List<AuRequest> requests, AuWriter out)

10:execUpdate(Execution exec, jList<AuRequest> requests, AuWriter out):void 

↓10-50:process(desktop, event) → 20

↓10-60:final List<AuResponse> responses = getResponses(exec, uv, errs, true);

↓out.writeResponseId(desktopCtrl.getResponseId(true))

↓out.write(responses);

↓final String seqId = ((ExecutionCtrl)exec).getRequestId()

↓desktopCtrl.responseSent(seqId, out.complete())

↓desktopCtrl.invokeExecutionCleanups(exec, null, errs)

↓config.invokeExecutionCleanups(exec, null, errs);

↓doDeactivate(exec);

↓meterAuServerComplete(pfmeter, doneReqIds, exec);

↑【DHUS】30-91に戻る

20:private void process(Desktop desktop, Event event)

↓20-30:processEvent(desktop, conp, event); → 30

↑10-50に戻る。

30:private void processEvent(Desktop desktop, Component comp, Event event)

↓30-30:EventProcessor proc = new EventProcessor(desktop, comp, event);

↓30-50:proc.process(); →【EP】10

↓30-60:EventProcessor.inEventListener(false);

↓30-70:cleanups = config.newEventThreadCleanups(comp, event, null, false);

↓30-80:config.invokeEventThreadCompletes(cleanups, comp, event, errs, false);

↑20-30に戻る。

 

【EP】 EventProcessor

EventProcessor > Object

EventProcessorクラスはZKのライブラリでorg.zkoss.zl.library>zk.jar>org.zkoss.zk.ui.implパッケージに含まれている。

public void process()

↓10-50:((ComponentCtrl)_comp).service(_event, scop) → 【A】10

↓10-51:((DesktopCtrl)_desktop).afterProcessEvent(_event)

↓10-60:final Execution exec = _desktop.getExecution()

↓10-70:((ExecutionCtrl)exec).setExecutionInfo(null);

↓10-90:Scopes.afterInterpret();

↑【UEI】30-50に戻る。

 

【A】A

A > AbstractTagAbstractComponent > Object

aクラスはZKのライブラリでorg.zkoss.zl.library>zhtml.jar>org.zkoss.zhtmlパッケージに含まれている。

10:public void service(Event event, Scope scope)

↓10-10:service(event,scope,listeners,evthd,mtd,false) → 20

↑【EP】10-50に戻る。

20:void service(Event event, Scope scope, final List<EventListenerInfo> listeners, final EventHandler evthd, final Method mtd, boolean skipPageListener)

↓20-50:onEvent(li.listener,event) → 【AC】10

↓20-60:event.isPropagatable()

↑10-10に戻る。

 

【AC】AbstractComponent

AbstractComponent  > Object

AbstractComponentクラスはZKのライブラリでorg.zkoss.zl.library>zk.jar>org.zkoss.zk.uiパッケージに含まれている。

10:private static void onEvent(EventListener listener, Event event)

↓10-10:listener.onEvent(event) →【DPF】10

↑【A】20-50に戻る。

 

お気に入りのメニューをクリックした処理

【DPF】DPFavourites

◆DPFavourites (I/F)EventListener > DashboardPanel (I/F) iDashboardPanel > Window > Window (I/F)Framable, IdSpace > XulElement > HtmlBasedComponent > AbstractComponent (I/F) Component, ComponentCtrl 

DPFavouritesクラスはorg.adempiere.ui.zk>WEB-INF/src>org.adempiere.webui.dashboardパッケージに含まれている。

10:public void onEvent(Event event)

↓10-10:doOnClick(comp)→20

↑【AC】10-10に戻る。

20:private void doOnClick(Component comp)

↓20-10:SessionManager.getAppDesktop().onMenuSelected(menuId) →【DD】10

↑10-10に戻る。

 

【DD】DefaultDesktop

◆DefaultDesktop > TabbedDesktop > AbstractDesktop > AbstractUIPart

DPFavouritesクラスはorg.adempiere.ui.zk>WEB-INF/src>org.adempiere.webui.desktopパッケージに含まれている。

10:public void onMenuSelected(int menuId)

↓10-10:MMenu menu = new MMenu(Env.getCtx(), menuId, null);

↓10-30:openWindow(menu.getAD_Window_ID(),null) → 20

↑【DPE】20-10に戻る

20:public void openWindow(int windowId, Callback<ADWindow> callback)

↓20-10:openWindow(windowId, null, callback) → 30

↑10-30に戻る

30:public void openWindow(int windowId, MQuery query, Callback<ADWindow> callback)

↓30-10:final ADWindow adWindow = new ADWindow(Env.getCtx().windowId,query) →【ADW】10

↓30-20:final DesktopTabpanel tabPanel = new DesktopTabpanel();

↓30-30:final Tab tab = windowContainer.addWindow(tabPanel, adWindow.getTitle(), true);

↓30-60:final OpenWindowRunnable runnable = new OpenWindowRunnable(adWindow, tab, tabPanel, callback)

↓30-70:tabPanel.addEventListener("onOpenWindow", new EventListener<Event>()

{

@Overridepublic

void onEvent(Event event) throws Exception

{

runnable.run();

}

});

↓30-80:preOpenNewTab()

↓30-90:Events.echoEvent(new Event("onOpenWindow", tabPanel));

↑20-10に戻る。

 

【ADW】ADWindow

◆ADWindow > AbstractUIPart > UIPart

ADWindowクラスはorg.adempiere.ui.zk>WEB-INF/src>org.adempiere.webui.adwindowパッケージに含まれている。

10:public ADWindow(Properties ctx, int adWindowId, MQuery query)

↓10-50:init() → 20

↑【DD】30-10に戻る

20:private void init()

↓20-10:windowContent = new ADWindowContent(ctx, windowNo, adWindowId); →【ADWC】10

↑10-50に戻る。

 

【ADWC】ADWindowContent

◆ADWindowContent > AbstractADWindowContent > AbstractUIPart > UIpart

ADWindowContentクラスはorg.adempiere.ui.zk>WEB-INF/src>org.adempiere.webui.adwindowパッケージに含まれている。

10:public ADWindowContent(Properties ctx, int windowNo, int adWindowId)

↓10-10:super(ctx, windowNo, adWindowId) →【AADWC】 10

↑【ADW】20-10に戻る

【AADWC】AbstractADWindowContent

10:public AbstractADWindowContent(Properties ctx, int windowNo, int adWindowId)

↓10-10:initComponents(); → 20

↑【ADWC】10-10に戻る。

20:private void initComponents()

↓20-10:toolbar = new ADWindowToolbar(getWindowNo()) →【ADWT】

↓20-20:statusBar = new StatusBar() →【SB】

↓20-30:GridWindowVO gWindowVO = AEnv.getMWIndowVO(int,int.int) →【AE】10

↓20-40:new GridWindow(GridWindowVO, true) →【GW】10

↑10-10に戻る。

 

ツールバーの作成

ステータスバーの作成

GridWindowVOの作成

【AE】AEnv

10:public static GridWindowVO getMWindowVO (int WindowNo, int AD_Window_ID, int AD_Menu_ID)

↓10-40:mWindowVO = GridWindowVO.create (Env.getCtx(), WindowNo, AD_Window_ID, AD_Menu_ID);

↑【AADWC】20-30に戻る。

 

GridWindowの作成

【GW】GridWindow

10:public GridWindow (GridWindowVO vo, boolean virtual)

↓10-10:loadTabData() → 20

↓10-20:enableEvents() → 30

↑【AADWC】20-40に戻る。

20:private boolean loadTabData()

for(int t = 0; t < m_vo.Tabs.size(); t++)

{

↓20-20:GridTabVO mTabVO = (GridTabVO)m_vo.Tabs.get(t);

↓20-40:GridTab mTab = new GridTab(mTabVO, this, m_virtual);

↓20-41:m_tabs.add(mTab)

}

10-10に戻る。

30:private void enableEvents()

30-10:for (int i = 0; i < getTabCount(); i++)

getTab(i).enableEvents();

10-20に戻る。