/* AfterCompose.java Purpose: Description: History: Jun 20, 2012, Created by Ian YT Tsai(Zanyking) Copyright (C) 2012 Potix Corporation. All Rights Reserved. */ package org.zkoss.bind.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * <p> * Marker annotation to identify a life-cycle method in View Model. this method will be called after host component composition has been done (AfterCompose).<br> * Only one method could be tagged with this annotation.<br> * </p> * <p><b>Inheritance:</b> * If you want binder to call super calss's afterCompose method also, you have to set * {@link #superclass()} to true, and super class's afterCompose method will be called first.<br> * * In the other hand, if target bean class doesn't has an afterCompose method but it's super has, * you'll have to annotate {@link AfterCompose} on the bean type. * </p> * * <p> * For example, in class hierarchy A(has @AfterCompose) <- B(has @AfterCompose, superclass true) <- C(no @AfterCompose) <- D (has @AfterCompose, superclass false). D is the last one. <br/> * If D is the view model, will call D.afterCompose only<br/> * If C is the view model, no method will be called <br/> * If B is the view model, will call A.afterCompose then B.afterCompose <br/> * If A is the view model, will call A.afterCompose <br/> * </p> * * <p> <b>Exception</b>: if {@link #superclass()} was been set to true and your afterCompose method * is an overridden method to it's super's afterCompose method, ex:<br> * <code> X.m1() <- Y.m1() </code><br> * then Binder will throw an exception due to the conflict of java language's overriding nature.<br> * </p> * * <p> <b>Parameter Binding</b>: for convenience, afterCompose method support several kinds of * Parameter Annotations. Binder will weave it's context(Zul page annotation, Java EE Context) * with method's parameters while invocation.<br> * The difference between @AfterCompose and @Init is - afterCompose has no zul declaration's part * by it's self. Instead, it will share BindingParam's with @init declaration in zul. * An example of afterCompose method signature might be looks like this:<br> * * <code>viewModel="@id('vm') @init('BlaBlaVM', a='b')"</code><br> * <code>@AfterCompose public void doAfterCompose(@BindingParam("a") String a)</code><br> * * * * @see BindingParam * @see ExecutionParam * @see ExecutionArgParam * @see HeaderParam * @see CookieParam * @see QueryParam * @see ScopeParam * @see ContextParam * @see Default * * @see Init * * @author Ian Y.T Tsai(zanyking) * @since 6.0.2 */ @Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface AfterCompose { boolean superclass() default false; }