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 group 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 = "checkGroup") 019 public @interface OnlyThreadWithGroupName { 020 /** 021 * Group name of the thread. If the regex member is true, then this is treated as a regular expression. 022 * @return group name or regular expression for the group 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 group name is equal 039 * to the 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 = "checkGroup") 045 public static @interface InField { 046 /** 047 * The class that contains the field specifying the group 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 group 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 group name is 065 * equal to the string in the field specified by class name and field name. 066 * 067 * @author Mathias Ricken 068 */ 069 @Retention(RetentionPolicy.RUNTIME) 070 @Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE}) 071 072 @PredicateLink(value = ReflectionThreadCheckPredicates.class, method = "checkGroupByName") 073 public static @interface ByName { 074 /** 075 * The name of the class that contains the field specifying the name of threads allowed to run. 076 * 077 * @return class containing the field 078 */ 079 String fieldClassName(); 080 081 /** 082 * The name of the field specifying the name of threads allowed to run. 083 * 084 * @return name of the field 085 */ 086 String fieldName(); 087 088 089 // 090 // nested interfaces 091 // 092 093 /** 094 * Annotation used to designate methods that are only allowed to be run by a thread whose name 095 * is equal to the string in one of the fields provided, i.e. the individual 096 * @OnlyThreadWithName.InField.ByName annotations are combined using OR. 097 */ 098 @Retention(RetentionPolicy.RUNTIME) 099 @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE}) 100 101 @Combine(Combine.Mode.OR) 102 public static @interface None { 103 OnlyThreadWithGroupName.InField.ByName[] value(); 104 } 105 } 106 107 108 /** 109 * Annotation used to designate methods that are only allowed to be run by a thread whose name 110 * is equal to the string in one of the fields provided, i.e. the individual 111 * @OnlyThreadWithName.InField annotations are combined using OR. 112 */ 113 @Retention(RetentionPolicy.RUNTIME) 114 @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE}) 115 116 @Combine(Combine.Mode.OR) 117 public static @interface Any { 118 OnlyThreadWithName.InField[] value(); 119 } 120 } 121 122 /** 123 * Annotation used to designate methods that are only allowed to be run by a thread whose 124 * thread group name is equal to one of the names provided, i.e. the individual 125 * @OnlyThreadWithGroupName annotations are combined using OR. 126 */ 127 @Retention(RetentionPolicy.RUNTIME) 128 @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE}) 129 130 @Combine(Combine.Mode.OR) 131 public static @interface Any { 132 OnlyThreadWithGroupName[] value(); 133 } 134 }