/sigmah/src/test/java/org/sigmah/server/dao/hibernate/LoadDataSet.java

http://sigma-h.googlecode.com/ · Java · 119 lines · 101 code · 14 blank · 4 comment · 8 complexity · 35badd4591f5006d1412735168a6538f MD5 · raw file

  1. /*
  2. * All Sigmah code is released under the GNU General Public License v3
  3. * See COPYRIGHT.txt and LICENSE.txt.
  4. */
  5. package org.sigmah.server.dao.hibernate;
  6. import org.dbunit.DatabaseUnitException;
  7. import org.dbunit.database.DatabaseConnection;
  8. import org.dbunit.database.IDatabaseConnection;
  9. import org.dbunit.dataset.DataSetException;
  10. import org.dbunit.dataset.IDataSet;
  11. import org.dbunit.dataset.xml.FlatXmlDataSet;
  12. import org.dbunit.ext.h2.H2Connection;
  13. import org.dbunit.ext.hsqldb.HsqldbConnection;
  14. import org.dbunit.ext.mssql.InsertIdentityOperation;
  15. import org.dbunit.ext.mssql.MsSqlConnection;
  16. import org.dbunit.operation.DatabaseOperation;
  17. import org.hibernate.Session;
  18. import org.hibernate.ejb.HibernateEntityManager;
  19. import org.hibernate.jdbc.Work;
  20. import org.junit.internal.runners.model.MultipleFailureException;
  21. import org.junit.runners.model.Statement;
  22. import org.sigmah.server.dao.DatabaseCleaner;
  23. import javax.persistence.EntityManager;
  24. import javax.persistence.EntityManagerFactory;
  25. import java.io.IOException;
  26. import java.io.InputStream;
  27. import java.io.InputStreamReader;
  28. import java.sql.Connection;
  29. import java.sql.SQLException;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. public class LoadDataSet extends Statement {
  33. private final Statement next;
  34. private final Object target;
  35. private final EntityManagerFactory emf;
  36. private String name;
  37. public LoadDataSet(EntityManagerFactory emf, Statement next, String name, Object target) {
  38. this.next = next;
  39. this.target = target;
  40. this.emf = emf;
  41. this.name = name;
  42. }
  43. @Override
  44. public void evaluate() throws Throwable {
  45. System.err.println("DBUnit: removing all rows");
  46. removeAllRows();
  47. System.err.println("DBUnit: loading " + name + " into the database.");
  48. IDataSet data = loadDataSet();
  49. List<Throwable> errors = new ArrayList<Throwable>();
  50. errors.clear();
  51. try {
  52. populate(data);
  53. next.evaluate();
  54. } catch (Throwable e) {
  55. errors.add(e);
  56. }
  57. MultipleFailureException.assertEmpty(errors);
  58. }
  59. private IDataSet loadDataSet() throws IOException, DataSetException {
  60. InputStream in = target.getClass().getResourceAsStream(name);
  61. if (in == null) {
  62. throw new Error("Could not find resource '" + name + "'");
  63. }
  64. return new FlatXmlDataSet(new InputStreamReader(in), false, true, false);
  65. }
  66. private void populate(final IDataSet dataSet) {
  67. executeOperation(InsertIdentityOperation.INSERT, dataSet);
  68. }
  69. private void removeAllRows() {
  70. EntityManager em = emf.createEntityManager();
  71. DatabaseCleaner cleaner = new DatabaseCleaner(em, SQLDialectProvider.from(em));
  72. cleaner.clean();
  73. em.close();
  74. }
  75. private void executeOperation(final DatabaseOperation op, final IDataSet dataSet) {
  76. HibernateEntityManager hem = (HibernateEntityManager) emf.createEntityManager();
  77. Session session = hem.getSession();
  78. session.doWork(new Work() {
  79. @Override
  80. public void execute(Connection connection) throws SQLException {
  81. try {
  82. IDatabaseConnection dbUnitConnection = createDbUnitConnection(connection);
  83. op.execute(dbUnitConnection, dataSet);
  84. } catch (DatabaseUnitException e) {
  85. throw new RuntimeException(e);
  86. }
  87. }
  88. });
  89. hem.close();
  90. }
  91. private IDatabaseConnection createDbUnitConnection(Connection connection) throws DatabaseUnitException, SQLException {
  92. String dbName = connection.getMetaData().getDatabaseProductName();
  93. if(dbName.equals("Microsoft SQL Server")) {
  94. IDatabaseConnection con = new MsSqlConnection(connection);
  95. con.getConfig().setProperty("http://www.dbunit.org/properties/escapePattern", "[?]");
  96. return con;
  97. } else if(dbName.equals("HSQL Database Engine")) {
  98. return new HsqldbConnection(connection, null);
  99. } else if(dbName.equals("H2")) {
  100. return new H2Connection(connection, null);
  101. } else {
  102. return new DatabaseConnection(connection);
  103. }
  104. }
  105. }