Skip to content

Instantly share code, notes, and snippets.

@skempken
Created January 13, 2014 14:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skempken/8401764 to your computer and use it in GitHub Desktop.
Save skempken/8401764 to your computer and use it in GitHub Desktop.
Class that simulates the EJB Dependency Injection mechanism. May be used to inject mock implementations in tests. Originally based on http://blog.bbv.ch/2011/03/24/ejb-dependency-injection-and-unit-testing/, but enhanced for subclassing.
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.persistence.PersistenceContext;
public class EjbInjector {
private static final List<Class<? extends Annotation>> EJB_ANNOTATIONS;
static {
EJB_ANNOTATIONS = new ArrayList<Class<? extends Annotation>>();
EJB_ANNOTATIONS.add(EJB.class);
EJB_ANNOTATIONS.add(PersistenceContext.class);
EJB_ANNOTATIONS.add(Resource.class);
}
final Map<Class<?>, Object> mappings = new HashMap<Class<?>, Object>();
public void inject(final Object bean) throws Exception {
for (final Field field : getEJBAnnotatedFields(bean)) {
injectField(field, bean);
}
}
public void assign(final Class<?> type, final Object instance) {
mappings.put(type, instance);
}
private void injectField(final Field field, final Object bean) throws Exception {
final Object instanceToInject = mappings.get(field.getType());
if (!field.isAccessible()) {
field.setAccessible(true);
}
field.set(bean, instanceToInject);
}
private List<Field> getEJBAnnotatedFields(final Object bean) {
final Class<? extends Object> beanClass = bean.getClass();
final List<Field> annotatedFields = new ArrayList<Field>();
for (final Field field : getAllFields(beanClass)) {
if (hasEJBAnnotation(field)) {
annotatedFields.add(field);
}
}
return annotatedFields;
}
private List<Field> getAllFields(Class<? extends Object> beanClass)
{
final List<Field> result = new LinkedList<Field>();
do
{
result.addAll(Arrays.asList(beanClass.getDeclaredFields()));
beanClass = beanClass.getSuperclass();
} while (!beanClass.equals(Object.class));
return result;
}
private static boolean hasEJBAnnotation(final Field field) {
for (final Class<? extends Annotation> annotation : EJB_ANNOTATIONS) {
if (field.isAnnotationPresent(annotation)) {
return true;
}
}
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment