001    package edu.rice.cs.cunit.threadCheck.predicates;
002    
003    import edu.rice.cs.cunit.threadCheck.PredicateLink;
004    import edu.rice.cs.cunit.threadCheck.Combine;
005    
006    import java.lang.annotation.Retention;
007    import java.lang.annotation.RetentionPolicy;
008    import java.lang.annotation.Target;
009    import java.lang.annotation.ElementType;
010    
011    /**
012     * An annotation used to designate methods that are only allowed to be run by a thread with the specified name.
013     * @author Mathias Ricken
014     */
015    @Retention(RetentionPolicy.RUNTIME)
016    @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
017    
018    @PredicateLink(value = ThreadCheckPredicates.class, method = "checkName")
019    public @interface OnlyThreadWithName {
020        /**
021         * Name of the thread. If the regex member is true, then this is treated as a regular expression.
022         * @return name or regular expression for the name of the thread allowed to run
023         */
024        String value();
025    
026        /**
027         * Determines if the string in the value member is a regular expression (true) or a plain string (false).
028         * @return true if the string in the value member is a regular expression
029         */
030        boolean regex() default false;
031    
032    
033        //
034        // nested interfaces
035        //
036    
037        /**
038         * An annotation used to designate methods that are only allowed to be run by a thread whose name is equal to the
039         * string in the field specified by class and field name.
040         */
041        @Retention(RetentionPolicy.RUNTIME)
042        @Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
043    
044        @PredicateLink(value = ReflectionThreadCheckPredicates.class, method = "checkName")
045        public static @interface InField {
046            /**
047             * The class that contains the field specifying the name of threads allowed to run.
048             * @return class containing the field
049             */
050            Class fieldClass();
051    
052            /**
053             * The name of the field specifying the name of threads allowed to run.
054             * @return name of the field
055             */
056            String fieldName();
057    
058    
059            //
060            // nested interfaces
061            //
062    
063            /**
064             * An annotation used to designate methods that are only allowed to be run by a thread whose name is equal to the
065             * string in the field specified by class name and field name.
066             */
067            @Retention(RetentionPolicy.RUNTIME)
068            @Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
069    
070            @PredicateLink(value = ReflectionThreadCheckPredicates.class, method = "checkNameByName")
071            public static @interface ByName {
072                /**
073                 * The name of the class that contains the field specifying the name of threads allowed to run.
074                 * @return class containing the field
075                 */
076                String fieldClassName();
077    
078                /**
079                 * The name of the field specifying the name of threads allowed to run.
080                 * @return name of the field
081                 */
082                String fieldName();
083                
084    
085                //
086                // nested interfaces
087                //
088                
089                /**
090                 * Annotation used to designate methods that are only allowed to be run by a thread whose name
091                 * is equal to the string in one of the fields provided, i.e. the individual
092                 * @OnlyThreadWithName.InField.ByName annotations are combined using OR.
093                 */
094                @Retention(RetentionPolicy.RUNTIME)
095                @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
096                        
097                @Combine(Combine.Mode.OR)
098                public static @interface Any {
099                    OnlyThreadWithName.InField.ByName[] value();
100                }
101            }
102            
103            /**
104             * Annotation used to designate methods that are only allowed to be run by a thread whose name
105             * is equal to the string in one of the fields provided, i.e. the individual
106             * @OnlyThreadWithName.InField annotations are combined using OR.
107             */
108            @Retention(RetentionPolicy.RUNTIME)
109            @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
110                    
111            @Combine(Combine.Mode.OR)
112            public static @interface Any {
113                OnlyThreadWithName.InField[] value();
114            }
115        }
116        
117        /**
118         * Annotation used to designate methods that are only allowed to be run by a thread whose name
119         * is equal to one of the names provided, i.e. the individual @OnlyThreadWithName annotations
120         * are combined using OR.
121         */
122        @Retention(RetentionPolicy.RUNTIME)
123        @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
124    
125        @Combine(Combine.Mode.OR)
126        public static @interface Any {
127            OnlyThreadWithName[] value();
128        }
129    }