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.ElementType;
007    import java.lang.annotation.Retention;
008    import java.lang.annotation.RetentionPolicy;
009    import java.lang.annotation.Target;
010    
011    /**
012     * An annotation used to designate methods that are not allowed to be run by the thread in the field specified by
013     * class and field name.
014     * @author Mathias Ricken
015     */
016    @Retention(RetentionPolicy.RUNTIME)
017    @Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
018    
019    @PredicateLink(value = NotReflectionThreadCheckPredicates.class, method = "checkThread")
020    public @interface NotThreadInField {
021        /**
022         * The class that contains the field specifying the thread that is allowed to run.
023         *
024         * @return class containing the field
025         */
026        Class fieldClass();
027    
028        /**
029         * The name of the field specifying the thread that is allowed to run.
030         *
031         * @return name of the field
032         */
033        String fieldName();
034        
035        //
036        // nested interfaces
037        //
038        
039        /**
040         * An annotation used to designate methods that are not allowed to be run by the thread in the field specified
041         * by class name and field name.
042         */
043        @Retention(RetentionPolicy.RUNTIME)
044        @Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
045    
046        @PredicateLink(value = NotReflectionThreadCheckPredicates.class, method = "checkThreadByName")
047        public static @interface ByName {
048            /**
049             * The name of the class that contains the field specifying the thread that is allowed to run.
050             *
051             * @return class containing the field
052             */
053            String fieldClassName();
054    
055            /**
056             * The name of the field specifying the thread that is allowed to run.
057             *
058             * @return name of the field
059             */
060            String fieldName();
061            
062            //
063            // nested interfaces
064            //
065            
066            /**
067             * Annotation used to designate methods that are not allowed to be run by any of the
068             * threads specified in the fields, i.e. the individual
069             * @NotThreadInField.ByName annotations are combined using AND.
070             */
071            @Retention(RetentionPolicy.RUNTIME)
072            @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
073                    
074            @Combine(Combine.Mode.AND)
075            public static @interface None {
076                OnlyThreadInField.ByName[] value();
077            }
078        }
079        
080        /**
081         * Annotation used to designate methods that are not allowed to be run by any of the
082         * threads specified in the fields, i.e. the individual
083         * @NotThreadInField annotations are combined using AND.
084         */
085        @Retention(RetentionPolicy.RUNTIME)
086        @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
087    
088        @Combine(Combine.Mode.AND)
089        public static @interface None {
090            OnlyThreadInField[] value();
091        }
092    }