/* Initiators.java Purpose: Description: History: Wed Dec 14 09:02:20 2005, Created by tomyeh Copyright (C) 2005 Potix Corporation. All Rights Reserved. {{IS_RIGHT This program is distributed under LGPL Version 2.1 in the hope that it will be useful, but WITHOUT ANY WARRANTY. }}IS_RIGHT */ package org.zkoss.zk.ui.impl; import java.util.Collections; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Page; import org.zkoss.zk.ui.UiException; import org.zkoss.zk.ui.metainfo.PageDefinition; import org.zkoss.zk.ui.util.Initiator; import org.zkoss.zk.ui.util.InitiatorExt; /** * A helper class used to handle {@link Initiator}. * * @author tomyeh * @see org.zkoss.zk.ui.sys.UiEngine */ /*package*/ class Initiators { /*package(inner)*/ static final Logger log = LoggerFactory.getLogger(Initiators.class); /** Invokes {@link Initiator#doInit}, if any, and returns * an instance of{@link Initiators}. * @param sysinits the system-level initiators */ @SuppressWarnings("unchecked") public static final Initiators doInit(PageDefinition pagedef, Page page, Initiator[] sysinits) { if (sysinits != null) try { for (int j = 0; j < sysinits.length; ++j) sysinits[j].doInit(page, Collections.EMPTY_MAP); } catch (Throwable ex) { throw UiException.Aide.wrap(ex); } final List<Initiator> inits = pagedef != null ? pagedef.doInit(page) : null; boolean sysinitEx = false; if (sysinits != null) for (int j = 0; j < sysinits.length; ++j) if (sysinits[j] instanceof InitiatorExt) { sysinitEx = true; break; } boolean initEx = false; if (inits != null) for (Initiator init : inits) if (init instanceof InitiatorExt) { initEx = true; break; } if (!sysinitEx && !initEx) return new Initiators(); return new RealInits(sysinits, inits, sysinitEx, initEx); } protected Initiators() { } public void doAfterCompose(Page page, Component[] comps) throws Exception { } public boolean doCatch(Throwable t) { return false; } public void doFinally() { } private static class RealInits extends Initiators { private final Initiator[] _sysinits; private final List<Initiator> _inits; private boolean _sysinitEx, _initEx; /** * @param inits a collection of {@link Initiator}. * @param sysinitEx whether any of sysinits implements InitiatorExt * @param initEx whether any of inits implements InitiatorExt */ private RealInits(Initiator[] sysinits, List<Initiator> inits, boolean sysinitEx, boolean initEx) { _sysinits = sysinits; _inits = inits; _sysinitEx = sysinitEx; _initEx = initEx; } /** * Invokes {@link Initiator#doAfterCompose}. * @param page * @throws Exception */ public void doAfterCompose(Page page, Component[] comps) throws Exception { if (_sysinitEx) for (int j = 0; j < _sysinits.length; ++j) { final Initiator init = _sysinits[j]; if (init instanceof InitiatorExt) { if (comps == null) comps = new Component[0]; ((InitiatorExt) init).doAfterCompose(page, comps); } } if (_initEx) for (Initiator init : _inits) { if (init instanceof InitiatorExt) { if (comps == null) comps = new Component[0]; ((InitiatorExt) init).doAfterCompose(page, comps); } } } /** Invokes {@link Initiator#doCatch}. * It eats all exception without throwing one (but logging). * Caller has to re-throw the exception. */ public boolean doCatch(Throwable t) { if (_sysinitEx) for (int j = 0; j < _sysinits.length; ++j) { final Initiator init = _sysinits[j]; if (init instanceof InitiatorExt) { try { if (((InitiatorExt) init).doCatch(t)) return true; } catch (Throwable ex) { Initiators.log.error("", ex); } } } if (_initEx) for (Initiator init : _inits) { if (init instanceof InitiatorExt) { try { if (((InitiatorExt) init).doCatch(t)) return true; //ignore and skip all other initiators } catch (Throwable ex) { Initiators.log.error("", ex); } } } return false; } /** Invokes {@link Initiator#doFinally}. */ public void doFinally() { Throwable t = null; if (_sysinitEx) for (int j = 0; j < _sysinits.length; ++j) { final Initiator init = _sysinits[j]; if (init instanceof InitiatorExt) { try { ((InitiatorExt) init).doFinally(); } catch (Throwable ex) { Initiators.log.error("", ex); if (t == null) t = ex; } } } if (_initEx) for (Initiator init : _inits) { if (init instanceof InitiatorExt) { try { ((InitiatorExt) init).doFinally(); } catch (Throwable ex) { Initiators.log.error("", ex); if (t == null) t = ex; } } } if (t != null) throw UiException.Aide.wrap(t); } } }