/** * Inject resources in specified instance. */ @Override protected void processAnnotations(Object instance) throws IllegalAccessException, InvocationTargetException, NamingException { if (context == null) { // No resource injection return; } checkAnnotation(instance.getClass(), instance); /* * May be only check non private fields and methods * for @Resource (JSR 250), if used all superclasses MUST be examined * to discover all uses of this annotation. */ Class superclass = instance.getClass().getSuperclass(); while (superclass != null && (!superclass.equals(Object.class))) { checkAnnotation(superclass, instance); superclass = superclass.getSuperclass(); } }
private void checkAnnotation(Class<?> clazz, Object instance) throws NamingException, IllegalAccessException, InvocationTargetException { // Initialize fields annotations Field[] fields = getDeclaredFieldBeans(clazz); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; checkFieldAnnotation(field, instance); } // Initialize methods annotations Method[] methods = getDeclaredMethods(clazz); for (int i = 0; i < methods.length; i++) { Method method = methods[i]; checkMethodAnnotation(method, instance); } }
private static Map<Class,Field[]> getDeclaredFieldBeansMap() { ClassLoader cl = ClassUtils.getContextClassLoader(); Map<Class,Field[]> metadata = (Map<Class,Field[]>) declaredFieldBeans.get(cl); if (metadata == null) { // Ensure thread-safe put over _metadata, and only create one map // per classloader to hold metadata. synchronized (declaredFieldBeans) { metadata = createDeclaredFieldBeansMap(cl, metadata); } } return metadata; }
Field[] getDeclaredFieldBeans(Class clazz) { Map<Class,Field[]> declaredFieldBeansMap = getDeclaredFieldBeansMap(); Field[] fields = declaredFieldBeansMap.get(clazz); if (fields == null) { fields = clazz.getDeclaredFields(); synchronized(declaredFieldBeansMap) { declaredFieldBeansMap.put(clazz, fields); } } return fields; }
protected void checkFieldAnnotation(Field field, Object instance) throws NamingException, IllegalAccessException { if (field.isAnnotationPresent(Resource.class)) { Resource annotation = field.getAnnotation(Resource.class); lookupFieldResource(context, instance, field, annotation.name()); } }
/** * Inject resources in specified method. */ protected static void lookupMethodResource(javax.naming.Context context, Object instance, Method method, String name) throws NamingException, IllegalAccessException, InvocationTargetException { if (!method.getName().startsWith("set") || method.getParameterTypes().length != 1 || !method.getReturnType().getName().equals("void")) { throw new IllegalArgumentException("Invalid method resource injection annotation"); } Object lookedupResource; if ((name != null) && (name.length() > 0)) { // TODO local or global JNDI lookedupResource = context.lookup(JAVA_COMP_ENV + name); } else { // TODO local or global JNDI lookedupResource = context.lookup(JAVA_COMP_ENV + instance.getClass().getName() + "/" + getFieldName(method)); } boolean accessibility = method.isAccessible(); method.setAccessible(true); method.invoke(instance, lookedupResource); method.setAccessible(accessibility); }
@Override protected void checkFieldAnnotation(Field field, Object instance) throws NamingException, IllegalAccessException { super.checkFieldAnnotation(field, instance); if (field.isAnnotationPresent(EJB.class)) { EJB annotation = field.getAnnotation(EJB.class); lookupFieldResource(context, instance, field, annotation.name()); } /*if (field.isAnnotationPresent(WebServiceRef.class)) { WebServiceRef annotation = (WebServiceRef) field.getAnnotation(WebServiceRef.class); lookupFieldResource(context, instance, field, annotation.name()); }*/ if (field.isAnnotationPresent(PersistenceContext.class)) { PersistenceContext annotation = field.getAnnotation(PersistenceContext.class); lookupFieldResource(context, instance, field, annotation.name()); } if (field.isAnnotationPresent(PersistenceUnit.class)) { PersistenceUnit annotation = field.getAnnotation(PersistenceUnit.class); lookupFieldResource(context, instance, field, annotation.name()); } } }
throws NamingException, IllegalAccessException, InvocationTargetException super.checkMethodAnnotation(method, instance); if (method.isAnnotationPresent(Resource.class))
return new ResourceAnnotationInjectionProvider(context);