package br.com.geraldoferraz.testyourquery.runner; import java.lang.reflect.Field; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import br.com.geraldoferraz.testyourquery.annotations.Dao; import br.com.geraldoferraz.testyourquery.annotations.JDBCConnection; import br.com.geraldoferraz.testyourquery.util.reflection.ClassReflector; public class EntityManagerConnectionInjector { private ClassReflector clazzReflector; private ConnectionFactory connectionFactory; private Object createdTest; public EntityManagerConnectionInjector(ClassReflector clazzReflector,ConnectionFactory connectionFactory) throws Exception { this.clazzReflector = clazzReflector; this.connectionFactory = connectionFactory; injectEntityManagerOnStaticFields(); injectConnectionOnStaticFields(); injectEntityManagerOnStaticDAOs(); } protected void injectOn(Object createdTest) throws Exception { this.createdTest = createdTest; injectEntityManagerOnStaticFields(); injectConnectionOnStaticFields(); injectEntityManagerOnStaticDAOs(); injectEntityManagerOnInstanceFields(); injectConnectionOnInstanceFields(); injectEntityManagerOnInstanceDAOs(); } private void injectEntityManagerOnInstanceDAOs() throws Exception { List<Field> fields = clazzReflector.getAnnotatedInstanceFields(Dao.class); for (Field field : fields) { Object daoObject = ClassReflector.newInstanceOf(field); ClassReflector.injectOn(field, createdTest, daoObject); List<Field> entityManagers = ClassReflector.getFieldsByType(EntityManager.class, daoObject); for (Field entityManagerField : entityManagers) { ClassReflector.injectOn(entityManagerField, daoObject, connectionFactory.getEntityManager()); } } } private void injectEntityManagerOnStaticDAOs() throws Exception{ List<Field> fields = clazzReflector.getAnnotatedStaticFields(Dao.class); Class<?> javaClass = clazzReflector.getJavaClass(); for (Field field : fields) { Object daoObject = ClassReflector.newInstanceOf(field); ClassReflector.injectOn(field, javaClass, daoObject); List<Field> entityManagers = ClassReflector.getFieldsByType(EntityManager.class, daoObject); for (Field entityManagerField : entityManagers) { ClassReflector.injectOn(entityManagerField, daoObject, connectionFactory.getEntityManager()); } } } private void injectEntityManagerOnInstanceFields() throws Exception { List<Field> fields = clazzReflector.getAnnotatedInstanceFields(PersistenceContext.class); for (Field field : fields) { ClassReflector.injectOn(field, createdTest, connectionFactory.getEntityManager()); } } private void injectEntityManagerOnStaticFields() throws Exception { List<Field> fields = clazzReflector.getAnnotatedStaticFields(PersistenceContext.class); Class<?> javaClass = clazzReflector.getJavaClass(); for (Field field : fields) { ClassReflector.injectStaticOn(field, javaClass, connectionFactory.getEntityManager()); } } private void injectConnectionOnInstanceFields() throws Exception { List<Field> fields = clazzReflector.getAnnotatedInstanceFields(JDBCConnection.class); for (Field field : fields) { ClassReflector.injectOn(field, createdTest, connectionFactory.getConnection()); } } private void injectConnectionOnStaticFields() { List<Field> fields = clazzReflector.getAnnotatedStaticFields(JDBCConnection.class); Class<?> javaClass = clazzReflector.getJavaClass(); for (Field field : fields) { ClassReflector.injectStaticOn(field, javaClass, connectionFactory.getConnection()); } } }