1 17 18 package org.apache.catalina.util; 19 20 import java.lang.reflect.Field ; 21 import java.lang.reflect.InvocationTargetException ; 22 import java.lang.reflect.Method ; 23 import java.lang.reflect.Modifier ; 24 25 import javax.annotation.PostConstruct; 26 import javax.annotation.PreDestroy; 27 import javax.annotation.Resource; 28 import javax.ejb.EJB ; 29 import javax.naming.NamingException ; 30 import javax.persistence.PersistenceContext; 31 import javax.persistence.PersistenceUnit; 32 import javax.xml.ws.WebServiceRef; 33 34 import org.apache.AnnotationProcessor; 35 36 37 44 public class DefaultAnnotationProcessor implements AnnotationProcessor { 45 46 protected javax.naming.Context context = null; 47 48 public DefaultAnnotationProcessor(javax.naming.Context context) { 49 this.context = context; 50 } 51 52 53 56 public void postConstruct(Object instance) 57 throws IllegalAccessException , InvocationTargetException { 58 59 Method [] methods = instance.getClass().getDeclaredMethods(); 60 Method postConstruct = null; 61 for (int i = 0; i < methods.length; i++) { 62 if (methods[i].isAnnotationPresent(PostConstruct.class)) { 63 if ((postConstruct != null) 64 || (methods[i].getParameterTypes().length != 0) 65 || (Modifier.isStatic(methods[i].getModifiers())) 66 || (methods[i].getExceptionTypes().length > 0) 67 || (!methods[i].getReturnType().getName().equals("void"))) { 68 throw new IllegalArgumentException ("Invalid PostConstruct annotation"); 69 } 70 postConstruct = methods[i]; 71 } 72 } 73 74 if (postConstruct != null) { 77 boolean accessibility = postConstruct.isAccessible(); 78 postConstruct.setAccessible(true); 79 postConstruct.invoke(instance); 80 postConstruct.setAccessible(accessibility); 81 } 82 83 } 84 85 86 89 public void preDestroy(Object instance) 90 throws IllegalAccessException , InvocationTargetException { 91 92 Method [] methods = instance.getClass().getDeclaredMethods(); 93 Method preDestroy = null; 94 for (int i = 0; i < methods.length; i++) { 95 if (methods[i].isAnnotationPresent(PreDestroy.class)) { 96 if ((preDestroy != null) 97 || (methods[i].getParameterTypes().length != 0) 98 || (Modifier.isStatic(methods[i].getModifiers())) 99 || (methods[i].getExceptionTypes().length > 0) 100 || (!methods[i].getReturnType().getName().equals("void"))) { 101 throw new IllegalArgumentException ("Invalid PreDestroy annotation"); 102 } 103 preDestroy = methods[i]; 104 } 105 } 106 107 if (preDestroy != null) { 110 boolean accessibility = preDestroy.isAccessible(); 111 preDestroy.setAccessible(true); 112 preDestroy.invoke(instance); 113 preDestroy.setAccessible(accessibility); 114 } 115 116 } 117 118 119 122 public void processAnnotations(Object instance) 123 throws IllegalAccessException , InvocationTargetException , NamingException { 124 125 if (context == null) { 126 return; 128 } 129 130 Field [] fields = instance.getClass().getDeclaredFields(); 132 for (int i = 0; i < fields.length; i++) { 133 if (fields[i].isAnnotationPresent(Resource.class)) { 134 Resource annotation = (Resource) fields[i].getAnnotation(Resource.class); 135 lookupFieldResource(context, instance, fields[i], annotation.name()); 136 } 137 if (fields[i].isAnnotationPresent(EJB .class)) { 138 EJB annotation = (EJB ) fields[i].getAnnotation(EJB .class); 139 lookupFieldResource(context, instance, fields[i], annotation.name()); 140 } 141 if (fields[i].isAnnotationPresent(WebServiceRef.class)) { 142 WebServiceRef annotation = 143 (WebServiceRef) fields[i].getAnnotation(WebServiceRef.class); 144 lookupFieldResource(context, instance, fields[i], annotation.name()); 145 } 146 if (fields[i].isAnnotationPresent(PersistenceContext.class)) { 147 PersistenceContext annotation = 148 (PersistenceContext) fields[i].getAnnotation(PersistenceContext.class); 149 lookupFieldResource(context, instance, fields[i], annotation.name()); 150 } 151 if (fields[i].isAnnotationPresent(PersistenceUnit.class)) { 152 PersistenceUnit annotation = 153 (PersistenceUnit) fields[i].getAnnotation(PersistenceUnit.class); 154 lookupFieldResource(context, instance, fields[i], annotation.name()); 155 } 156 } 157 158 Method [] methods = instance.getClass().getDeclaredMethods(); 160 for (int i = 0; i < methods.length; i++) { 161 if (methods[i].isAnnotationPresent(Resource.class)) { 162 Resource annotation = (Resource) methods[i].getAnnotation(Resource.class); 163 lookupMethodResource(context, instance, methods[i], annotation.name()); 164 } 165 if (methods[i].isAnnotationPresent(EJB .class)) { 166 EJB annotation = (EJB ) methods[i].getAnnotation(EJB .class); 167 lookupMethodResource(context, instance, methods[i], annotation.name()); 168 } 169 if (methods[i].isAnnotationPresent(WebServiceRef.class)) { 170 WebServiceRef annotation = 171 (WebServiceRef) methods[i].getAnnotation(WebServiceRef.class); 172 lookupMethodResource(context, instance, methods[i], annotation.name()); 173 } 174 if (methods[i].isAnnotationPresent(PersistenceContext.class)) { 175 PersistenceContext annotation = 176 (PersistenceContext) methods[i].getAnnotation(PersistenceContext.class); 177 lookupMethodResource(context, instance, methods[i], annotation.name()); 178 } 179 if (methods[i].isAnnotationPresent(PersistenceUnit.class)) { 180 PersistenceUnit annotation = 181 (PersistenceUnit) methods[i].getAnnotation(PersistenceUnit.class); 182 lookupMethodResource(context, instance, methods[i], annotation.name()); 183 } 184 } 185 186 } 187 188 189 192 protected static void lookupFieldResource(javax.naming.Context context, 193 Object instance, Field field, String name) 194 throws NamingException , IllegalAccessException { 195 196 Object lookedupResource = null; 197 boolean accessibility = false; 198 199 if ((name != null) && 200 (name.length() > 0)) { 201 lookedupResource = context.lookup(name); 202 } else { 203 lookedupResource = context.lookup(instance.getClass().getName() + "/" + field.getName()); 204 } 205 206 accessibility = field.isAccessible(); 207 field.setAccessible(true); 208 field.set(instance, lookedupResource); 209 field.setAccessible(accessibility); 210 } 211 212 213 216 protected static void lookupMethodResource(javax.naming.Context context, 217 Object instance, Method method, String name) 218 throws NamingException , IllegalAccessException , InvocationTargetException { 219 220 if (!method.getName().startsWith("set") 221 || method.getParameterTypes().length != 1 222 || !method.getReturnType().getName().equals("void")) { 223 throw new IllegalArgumentException ("Invalid method resource injection annotation"); 224 } 225 226 Object lookedupResource = null; 227 boolean accessibility = false; 228 229 if ((name != null) && 230 (name.length() > 0)) { 231 lookedupResource = context.lookup(name); 232 } else { 233 lookedupResource = 234 context.lookup(instance.getClass().getName() + "/" + method.getName().substring(3)); 235 } 236 237 accessibility = method.isAccessible(); 238 method.setAccessible(true); 239 method.invoke(instance, lookedupResource); 240 method.setAccessible(accessibility); 241 } 242 243 244 } 245 | Popular Tags |