package br.com.geraldoferraz.testyourquery.util.database; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import br.com.geraldoferraz.testyourquery.config.DefaultEntityManagerProvider; public class ConnectionManager { private List<Connection> connections = new ArrayList<Connection>();; private List<EntityManager> entityManagers = new ArrayList<EntityManager>(); private EntityManagerFactory emf; private DefaultEntityManagerProvider entityManagerProvider; public ConnectionManager(DefaultEntityManagerProvider entityManagerProvider) { this.entityManagerProvider = entityManagerProvider; emf = entityManagerProvider.getEntityManagerFactory(); } public void executeScript(List<String> scripts) throws SQLException{ EntityManager em = getNewEntityManager(); for (String script : scripts) { em.createNativeQuery(script).executeUpdate(); } } public Connection getNewConnection() { Connection connection = createConnection(); saveReference(connection); return connection; } private Connection createConnection() { return entityManagerProvider.getJDBCConnection(); } public EntityManager getNewEntityManager() { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); saveReference(em); return em; } private void saveReference(EntityManager em) { entityManagers.add(em); } private void saveReference(Connection connection) { connections.add(connection); } public void freeMemorySpace() { closeEntityManagers(); closeConnections(); System.gc(); } private void closeConnections() { for (Connection conn : connections) { try { conn.commit(); if (!conn.isClosed()) { conn.close(); } } catch (Exception e) { } } connections = new ArrayList<Connection>(); } private void closeEntityManagers() { for (EntityManager em : entityManagers) { em.getTransaction().commit(); if (em.isOpen()) { em.close(); } } entityManagers = new ArrayList<EntityManager>(); } public Connection getConnection() { return createConnection(); } public void clearData() { Set<Class<?>> entities = entityManagerProvider.getEntities(); Map<String, Boolean> estadoTabela = new HashMap<String, Boolean>(); for (Class<?> entityType : entities) { estadoTabela.put(entityType.getName(), false); } Set<String> keySet = estadoTabela.keySet(); while(tabelaPossuiAlguemSemExcluir(estadoTabela)){ for (String tabela : keySet) { try { if(estadoTabela.get(tabela) == false){ getNewEntityManager().createQuery("delete from " + tabela).executeUpdate(); estadoTabela.put(tabela, true); } } catch (Exception e) { } } } } private static boolean tabelaPossuiAlguemSemExcluir(Map<String, Boolean> estadoTabela) { Set<String> keySet = estadoTabela.keySet(); for (String tabela : keySet) { Boolean excluido = estadoTabela.get(tabela); if(!excluido){ return true; } } return false; } }