001    package edu.rice.cs.cunit.threadCheck;
002    
003    import java.lang.annotation.Retention;
004    import java.lang.annotation.RetentionPolicy;
005    import java.lang.annotation.Target;
006    import java.lang.annotation.ElementType;
007    
008    /**
009     * Annotation for a class or method signaling that it should only be run by the designated threads.
010     *
011     * The preferred method is using value and an array of @ThreadDesc annotations. This, however,
012     * can be mixed with the other ways of specifying threads, although they may not support more advanced
013     * features. The thread and thread group names are treated as regular expressions. You may not specify
014     * eventThread=true in more than once place.
015     *
016     * @author Mathias Ricken
017     */
018    @Retention(RetentionPolicy.CLASS)
019    @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
020    public @interface OnlyRunBy {
021        /** Describes selection of the event thread. */
022        public static enum EVENT_THREAD {
023            /** Event thread not selected. */
024            NO,
025            /** Only event thread may run after a component has been realized (for use with @OnlyRunBy). */
026            ONLY_AFTER_REALIZED,
027            /** Only event thread may run (for use inside @OnlyRunBy). */
028            ONLY
029        }
030    
031        /** @return array of thread descriptions. */
032        ThreadDesc[] value() default {};
033    
034        /** @return array of regular expressions for thread names that may exclusively run the annotated class or method. */
035        String[] threadNames() default {};
036    
037        /** @return array of thread ID numbers as returned by Thread.getID(), designating the threads
038          * that may exclusively run the annotated class or method. */
039        long[] threadIds() default {};
040    
041        /** @return array of regular expressions for thread group names that may exclusively run the annotated class or
042          * method. */
043        String[] threadGroups() default {};
044    
045        /** @return true if the event thread may exclusively run the annotated class or method. */
046        EVENT_THREAD eventThread() default EVENT_THREAD.NO;
047    }