001    package com.hammurapi.eventbus;
002    
003    import java.lang.annotation.ElementType;
004    import java.lang.annotation.Retention;
005    import java.lang.annotation.RetentionPolicy;
006    import java.lang.annotation.Target;
007    
008    /**
009     * Annotation to mark observer methods.
010     * @author Pavel Vlasov.
011     *
012     */
013    @Target({ElementType.METHOD})
014    @Retention(RetentionPolicy.RUNTIME)
015    public @interface Observer {
016            
017            /**
018             * @return Observer method priority. Methods with higher priority value get invoked before methods with lower priority value.
019             * Observeer method can invoke consume() method from EventDispatchContext to "consume" source fact(s) and prevent invocation 
020             * of subsequent handler methods.
021             */
022            int priority() default 0;
023            
024            /**
025             * Condition definition has the following format <code>[language://][parameter list:] condition expression</code>. Default language is Java.
026             * If language is not Java, then Java Scripting Framework is used to look up a script engine to evaluate the expression.
027             * Parameter list is a comma separated list of parameter names, parameters not used in the condition expression can be omitted. 
028             * E.g. <code>parent, child, sibling</code> or, if <code>child</code> is not 
029             * used in the condition expression <code>parent,,sibling</code>. If parameter list is omitted, then arguments are named <code>arg0</code>, <code>arg1</code>, etc. for
030             * method level conditions and <code>arg</code> for parameter level conditions.
031             * Condition expression is a fragment of Java code returning boolean. 
032             * Rule instance is available through <code>rule</code> parameter. 
033             * @return True if condition is fulfilled and further rule evaluation shall be attempted. If several conditions are specified, 
034             * then they are connected by AND and it is assumed that they can be reordered by the rule compilation/execution engine to
035             * build conditions chain.
036             */
037            String[] value() default {};
038            
039            /**
040             * This optional attribute informs the bus about event types which
041             * this method posts (if any). It allows the engine to optimize the
042             * predicate network.
043             * @return
044             */
045            Class<?>[] posts() default {};
046            
047            /**
048             * @return true if this observer consumes or updates events.
049             */
050            boolean consumes() default true;
051            
052            /**
053             * @return true if this observer shall be invoked only once.
054             */
055            boolean oneOff() default false;
056            
057    }